python – 从框架继承或不继承Tkinter应用程序

我看到了两种设置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类。我认为这是更合理的选择,因为窗口实际上是你的应用程序。从框架继承,对于我而言,从Button或Canvas或Label继承起来并没有什么意义。因为你只能有一个根,所以这是你继承的。

我还认为,如果您将导入作为导入Tkinter作为tk导入,而不是从Tkinter import *导入代码,则可以使代码更易读。所有的电话都明确提到了tk模块。我不建议所有的模块,但对我来说,Tkinter是有道理的。

例如:

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继承,我认为任何一种选择都优于继承于无…的代码中的第一个例子。

如果您希望应用程序支持多个相同的窗口,那么从Frame继承的一个轻微优点就是超过Tk。在这种情况下,从Frame继承可以让您创建第一个窗口作为root的子节点,另外还可以创建Toplevel实例的子窗口。但是,我看到很少有程序需要这样做。

有关如何构建Tkinter程序的更多信息,请参阅my answerPython Tkinter program structure的问题。

翻译自:https://stackoverflow.com/questions/7300072/inheriting-from-frame-or-not-in-a-tkinter-application

转载注明原文:python – 从框架继承或不继承Tkinter应用程序