首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象Tkinter

面向对象Tkinter
EN

Stack Overflow用户
提问于 2022-09-07 03:39:55
回答 2查看 131关注 0票数 0

我正在尝试写一个gui,它作为一个类,它是主要的应用程序。该类的单个实例在主根中创建。同时,我希望点击一个submit按钮,在进一步提交之前对一些值进行验证,以编写数据。我试图通过为Toplevel弹出窗口创建一个新类来实现这一点。但我不知道如何才能最好地构建这一体系。理想情况下,每次选择按钮时都会创建弹出窗口类的实例。就像我用这种方式构造它一样,已经创建了主应用程序类的另一个实例。我有点困惑如何使用OOP正确地完成这个任务。

下面是一些示例代码来说明这个问题。

代码语言:javascript
复制
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构建这样一个程序的最佳方法的理解中缺少了一些东西。

EN

回答 2

Stack Overflow用户

发布于 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__函数中创建框架。下面是代码工作代码以及这些更正:

代码

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2022-10-18 17:08:46

这是你想要的吗?对于所有的小部件,您都应该使用self.master

代码语言:javascript
复制
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()

结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73629865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档