首页 > 解决方案 > Python:以OO方式呈现的tkinter窗口

问题描述

我一直在尝试以 OO 方式表示 tkinter 窗口。这里的答案很少,我已经设法生成了一个工作代码,但我根本不明白它为什么工作。

import tkinter as tk
class CurrConv:
    def __init__(self, window, date):
        self.window = window
        window.title("Currency Converter")
        window.geometry("350x150+300+300")

        self.label = tk.Label(text="Date: {}\n".format(date))
        self.label.pack()

        self.text_box = tk.Text()
        self.text_box.insert("2.0", "100 is: {}\n".format(100))
        self.text_box.insert("3.0", "24  is: {}".format(24))
        self.text_box.pack()

        self.button = tk.Button(text="Quit", width=8, command=window.quit)
        self.button.place(relx=0.5, rely=0.9, anchor="center",)


def main():
    window = tk.Tk()
    app = CurrConv(window, 1234)
    window.mainloop()


if __name__ == "__main__":
    main()

我不明白的是“app”对象的用法。它在任何地方都没有使用,通常当我们创建一个对象(在任何编程语言中)时,我们都会对其调用某些操作。然而,在这里我们对 app 对象什么也不做。类封装似乎间接修改了“窗口”,这至少可以说是令人困惑的。

接下来,我不明白标签和文本框是如何添加到“window”中的,当在代码中我没有在“window”中创建它们时,我在“self”上创建它们,这将是“app”,这不是使用时间更长。

底线是,由于上述原因,我不明白上面的代码是如何工作的。

提前致谢。我希望我足够清楚。

标签: pythonooptkinter

解决方案


对于第一个问题,yesapp是一个对象。但它是类的一个实例CurrConv。当您初始化一个类时,您调用该类的__init__方法,在这种情况下,您执行该方法中的语句:修改窗口(您在创建时作为参数传递app)并向其添加小部件。所以虽然app没有直接使用,但它在创建时有做那些事情的副作用。由于这个原因,由于您只需要初始化方法,因此不需要分配给变量,您可以将其设为CurrConv(window, 1234).

对于第二个,是的,您在创建小部件时没有提及window,但是当未指定新 Tkinter 小部件的主控时,它将主主控(根,使用 创建tk.Tk())作为它的主控。


推荐阅读