我正在尝试写一个gui,它作为一个类,它是主要的应用程序。该类的单个实例在主根中创建。同时,我希望点击一个submit按钮,在进一步提交之前对一些值进行验证,以编写数据。我试图通过为Toplevel弹出窗口创建一个新类来实现这一点。但我不知道如何才能最好地构建这一体系。理想情况下,每次选择按钮时都会创建弹出窗口类的实例。就像我用这种方式构造它一样,已经创建了主应用程序类的另一个实例。我有点困惑如何使用OOP正确地完成这个任务。
下面是一些示例代码来说明这个问题。
import tkinter as tk
from tkinter import ttk
class Window(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.title = "TITLE"
self.master = master
self.submit = ttk.Button(self, text = 'SUBMIT', command = self.click_submit_button)
self.submit.grid(row = 0, column = 2, padx = 20, pady = 20)
def click_submit_button(self):
self.submit_pop_up = submit_button(self.master)
print('New PopUp')
class submit_button(tk.Toplevel):
def __init__(self, master):
tk.Toplevel.__init__(self, master)
self.master = master
self.title = 'TITLE'
if __name__ == "__main__":
root = tk.Tk()
app = Window(root)
app.pack()
root.mainloop()在我对使用OOP构建这样一个程序的最佳方法的理解中缺少了一些东西。
发布于 2022-10-18 13:52:35
解决方案
只需让submit_button类继承Window类,只实例化submiit_button类即可。这样,就不需要实例化Window类了。这允许一个特殊的技巧,这样您就可以访问submit_class类中的Window类的属性,而无需创建实例。只需使用self,因为它实际上是传递给Window类的submit_class的一个实例。这是你的代码。还有许多其他建议,要知道,请参阅代码。
建议
首先,为什么要让submit_button成为一个单独的类?您可以将它作为Window类的一种方法。如果你有充分的理由,这是可以的,但否则就让它成为一个方法。此外,为什么要创建根窗口并使window类将其保存为属性?只需让Window类继承tk.Tk而不是tk.Frame。然后,您可以在__init__函数中创建框架。下面是代码工作代码以及这些更正:
代码
import tkinter as tk
from tkinter import ttk
class Window(tk.Tk):
def __init__(self):
super().__init__()
self.title("TITLE")
self.submit = ttk.Button(self, text = 'SUBMIT', command = self.click_submit_button)
self.submit.grid(row = 0, column = 2, padx = 20, pady = 20)
class submit_button(Window):
def __init__(self):
super().__init__()
self.submit_pop_up = tk.Toplevel(self)
self.submit_pop_up.withdraw()
print(self.submit_pop_up)
def click_submit_button(self):
self.submit_pop_up.deiconify()
print('New PopUp')
if __name__ == "__main__":
app = submit_button()
app.mainloop()发布于 2022-10-18 17:08:46
这是你想要的吗?对于所有的小部件,您都应该使用self.master。
import tkinter as tk
from tkinter import ttk
class Window(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.master = master
self.master.title( "TITLE")
self.submit = ttk.Button(self.master, text='SUBMIT', command=self.click_submit_button)
self.submit.grid(row=0, column=2, padx=20, pady=20)
def click_submit_button(self):
self.submit_pop_up = submit_button(self.master)
print('New PopUp')
class submit_button(tk.Toplevel):
def __init__(self, master):
tk.Toplevel.__init__(self, master)
self.master = master
self.master.title('TITLE')
if __name__ == "__main__":
root = tk.Tk()
app = Window(root)
#app.pack()
root.mainloop()结果:

https://stackoverflow.com/questions/73629865
复制相似问题