如果不创建根窗口,Tkinter将在尝试创建任何其他小部件时为您创建一个根窗口。因此,在您的__init__中,由于在初始化帧时尚未创建根窗口,Tkinter将为您创建一个根窗口。然后,调用make_widgets,创建一个第二个根窗口。这就是你看到两扇窗户的原因。
编写良好的Tkinter程序应该在创建任何其他小部件之前,始终显式地创建一个根窗口。
当您修改代码以显式创建根窗口时,您将得到一个具有预期标题的窗口。
示例:from tkinter import Tk, Button, Frame, Entry, END
class ABC(Frame):
def __init__(self,parent=None):
Frame.__init__(self,parent)
self.parent = parent
self.pack()
self.make_widgets()
def make_widgets(self):
# don't assume that self.parent is a root window.
# instead, call `winfo_toplevel to get the root window
self.winfo_toplevel().title("Simple Prog")
# this adds something to the frame, otherwise the default
# size of the window will be very small
label = Entry(self)
label.pack(side="top", fill="x")
root = Tk()
abc = ABC(root)
root.mainloop()
还要注意使用self.make_widgets(),而不是ABC.make_widgets(self)。虽然两者最终都做了相同的事情,但前者是调用函数的正确方法。