如何创建两个Tk实例与一个主循环一起工作?

时间:2012-03-09 19:44:18

标签: python class tkinter

如何将master = Tk()添加到tkinter.Frame子类的__init__中 只调用app时会产生两个窗口(app2app.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()

1 个答案:

答案 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类创建其他窗口。