我一直在玩我的第一个Python Tkinter GUI。 在下面你找到我已经制作的脚本。老实说,我已经在互联网上四处寻找如何去做。
当我运行我的脚本时,我得到2个单独的窗口。 一个窗口,让我们调用这个"窗口A",用我的文本和输入框以及一个空窗口,让我们调用这个"窗口B"。
当我点击"运行"在"窗口A"我的phyton脚本(本例中为tennisMatchProbability.py)被触发,该脚本的结果(tennisMatchProbability.py)显示在"窗口B"。
这是输出" tennisMatchProbability.py"给出。
Server Game = 0.735729230769
Receiver Game= 0.264270769231
Tiebreak = 0.337026817252
Server Set = 0.205146215901
Receiver Set= 0.794853784099
Match Server= 0.108987765053
Match Receiver= 0.891012234947
我想要实现的是两个窗口都合并到一个窗口中。
我一直在尝试我能想到的一切,但无法弄清楚。
from Tkinter import *
import sys
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py")
class App(Frame):
def run_script(self):
sys.stdout = self
try:
del(sys.modules["tennisMatchProbability"])
except:
## Yeah, it's a real ugly solution...
pass
import tennisMatchProbability
tennisMatchProbability.matchProb()
sys.stdout = sys.__stdout__
def build_widgets(self):
self.text1 = Text(self)
self.text1.pack(side=TOP)
master = Tk()
Label(master, text="First Name").grid(row=0)
Label(master, text="Last Name").grid(row=1)
Label(master, text="Game Score").grid(row=2)
Label(master, text="Set Score").grid(row=3)
e1 = Entry(master)
e2 = Entry(master)
e3 = Entry(master)
e4 = Entry(master)
e1.delete(0,END)
e2.delete(0,END)
e3.delete(0,END)
e4.delete(0,END)
e1.insert(10,"Novak")
e2.insert(10,"Djokovic")
e3.insert(10,"30-15")
e4.insert(10,"3-1")
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
e3.grid(row=2, column=1)
e4.grid(row=3, column=1)
Button(master, text='Run', command=self.run_script).grid(row=4, column=1, sticky=W, pady=4)
def write(self, txt):
self.text1.insert(INSERT, txt)
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.build_widgets()
root = Tk()
app = App(master = root)
app.mainloop()
答案 0 :(得分:2)
答案很简单: 在build_widgets方法中,您正在使用
构建一个新的Tk框架和tcl解释器 master = Tk()
你的应用程序中永远不应该有两个Tk()调用。 解决方案是删除此行并将master的每次出现更改为self。 Self表示您的app类,它继承自tk.Frame类,因此是您的主框架。
你的run_scipt的构建也很奇怪。你为什么不这样做?
def run_script(self):
inputs = self.read_tk_fields()
result = tennisMatchProbability.matchProb(inputs)
这是完整的代码
from Tkinter import *
import sys
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py")
import tennisMatchProbability
class App(Frame):
def run_script(self):
inputs = self.read_tk_field()
result = tennisMatchProbability.matchProb(inputs)
self.show_prob_result(result)
def show_prob_result(self,result):
self.result_label.config(text=result)
def build_widgets(self):
Label(self, text="First Name").grid(row=0)
Label(self, text="Last Name").grid(row=1)
Label(self, text="Game Score").grid(row=2)
Label(self, text="Set Score").grid(row=3)
e1 = Entry(self)
e2 = Entry(self)
e3 = Entry(self)
e4 = Entry(self)
self.result_label = Label(self)
e1.insert(10,"Novak")
e2.insert(10,"Djokovic")
e3.insert(10,"30-15")
e4.insert(10,"3-1")
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
e3.grid(row=2, column=1)
e4.grid(row=3, column=1)
self.result_label.grid(row=4, column=1)
Button(self, text='Run', command=self.run_script).grid(row=5, column=1, sticky=W, pady=4)
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.build_widgets()
root = Tk()
app = App(master = root)
app.mainloop()
答案 1 :(得分:0)
@Jannick,用你的脚本我不会在GUI中得到结果。使用您的脚本,我可以在CMD和" Run"中获得结果。 bottun给出错误
使用下面的代码,我可以在GUI中获得结果。
from Tkinter import *
import sys
sys.path.append("C:\Users\Magali\Desktop\Tennis\tennisMatchProbability.py")
class App(Frame):
def run_script(self):
sys.stdout = self
try:
del(sys.modules["tennisMatchProbability"])
except:
## Yeah, it's a real ugly solution...
pass
import tennisMatchProbability
tennisMatchProbability.matchProb()
sys.stdout = sys.__stdout__
def build_widgets(self):
self.text1 = Text(self)
self.text1.grid(row=5)
Label(self, text="First Name").grid(row=0)
Label(self, text="Last Name").grid(row=1)
Label(self, text="Game Score").grid(row=2)
Label(self, text="Set Score").grid(row=3)
e1 = Entry(self)
e2 = Entry(self)
e3 = Entry(self)
e4 = Entry(self)
e1.delete(0,END)
e2.delete(0,END)
e3.delete(0,END)
e4.delete(0,END)
e1.insert(10,"Novak")
e2.insert(10,"Djokovic")
e3.insert(10,"30-15")
e4.insert(10,"3-1")
e1.grid(row=0,column=1)
e2.grid(row=1, column=1)
e3.grid(row=2, column=1)
e4.grid(row=3, column=1)
Button(self,text='Run', command=self.run_script).grid(row=4, column=1, sticky=W, pady=4)
def write(self, txt):
self.text1.insert(INSERT, txt)
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.build_widgets()
root = Tk()
app = App(master = root)
app.mainloop()