如何将master = Tk()
添加到tkinter.Frame子类的__init__
中
只调用app
时会产生两个窗口(app2
和app.mainloop()
)?
from tkinter import Frame,Button,Tk
class Application(Frame):
def say_hi(self):
print('Hello world?!')
def close(self):
self.master.destroy()
def createWidgets(self):
self.quit_b = Button(self, width=12, text='Quit', bg='tan',
command=self.close)
self.quit_b.grid(row=0, column=0, padx=8, pady=8)
self.hello_b = Button(self, width=12, text='Hello',
command=self.say_hi)
self.hello_b.grid(row=0, column=1, padx=8, pady=8)
def __init__(self):
master = Tk() # <------------------------ ! see here !
Frame.__init__(self, master)
self.grid()
self.createWidgets()
app = Application()
app.master.title('Hello world!')
app2 = Application()
app2.master.title('Hello world! 2')
app.mainloop()
答案 0 :(得分:2)
您无法创建类Tk
的两个实例,并且在另一个类的__init__
内实例化它有点不寻常。你的代码应该可行,但我从未见过这样做过。
在创建任何其他小部件之前,您需要创建Tk
的实例。由于您的主应用程序是Frame
的子类,因此在初始化Tkinter之前,您部分地创建了Frame
的实例,这根本不是它应该完成的方式。它可能有效,但行为未定义。
相反,通常最好将您的应用程序创建为Tk的子类:
from Tkinter import tk
class Application(tk.Tk):
...
app = Application(...)
app.mainloop()
或者,在全局范围内创建Tk
的实例,并将其作为参数传递给其他小部件:
from Tkinter import tk
class Application(tkFrame):
...
root = tk.Tk()
myframe = Application(root)
root.mainloop()
如果您需要多个窗口,请使用Toplevel
类创建其他窗口。