小编典典

在Tkinter应用程序中是否继承自Frame

python

我已经看到了设置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()

阅读 221

收藏
2020-12-20

共1个答案

小编典典

我更喜欢*的选项是从Tk类继承。我认为这是更合理的选择,因为窗口实际上是您的应用程序。来自继承,Frame没有任何我更有意义,然后继承ButtonCanvasLabel。由于您只能有一个根,因此这就是您继承的根。

我还认为,如果您执行导入操作import Tkinter as tk而不是,它会使代码更具可读性from 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程序的更多信息,请参阅我对[PythonTkinter程序结构问题的回答

2020-12-20