我已经看到了设置tkinter程序的两种基本方法。有什么理由更喜欢另一种吗?
from Tkinter import * class Application(): def __init__(self, root, title): self.root = root self.root.title(title) self.label = Label(self.root, text='Hello') self.label.grid(row=0, column=0) root = Tk() app = Application(root, 'Sample App') root.mainloop()
和
from Tkinter import * class Application(Frame): def __init__(self, title, master=None): Frame.__init__(self, master) self.grid() self.master.title(title) self.label = Label(self, text='Hello') self.label.grid(row=0, column=0) app = Application('Sample App') app.mainloop()
我更喜欢*的选项是从Tk类继承。我认为这是更合理的选择,因为窗口实际上是您的应用程序。来自继承,Frame没有任何我更有意义,然后继承Button或Canvas或Label。由于您只能有一个根,因此这就是您继承的根。
Frame
Button
Canvas
Label
我还认为,如果您执行导入操作import Tkinter as tk而不是,它会使代码更具可读性from Tkinter import *。然后,您所有的呼叫都明确提及该tk模块。我不建议所有模块都使用此功能,但对我来说,使用Tkinter有意义。
import Tkinter as tk
from Tkinter import *
tk
例如:
import Tkinter as tk class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.label = tk.Label(text="Hello, world") self.label.pack(padx=10, pady=10) app = SampleApp() app.mainloop()
*注意: 自从最初编写此答案以来,我已经改变了立场。我现在宁愿继承Frame而不是继承Tk。一种或另一种方式没有真正的优势,它比其他任何东西更多地是一种哲学选择。无论如何,我相信无论您是继承自Frame还是Tk,我都认为选择要比代码中第一个不继承任何内容的示例更好。
Tk
从头继承Frame过来的一个小优点Tk是,您希望您的应用程序支持多个相同的窗口。在这种情况下,从继承Frame可让您将第一个窗口创建为root的子代,并将其他窗口创建为实例的子代Toplevel。但是,我看到很少有程序需要这样做。
Toplevel
有关我认为应该如何构造Tkinter程序的更多信息,请参阅我对[PythonTkinter程序结构问题的回答。