【问题标题】:Inheritance issue with overwriting Notebook - python,tkinter覆盖笔记本的继承问题 - python,tkinter
【发布时间】:2020-10-13 22:22:51
【问题描述】:

我暂时无法在几个小时内解决此问题。问题是我无法添加适当的继承方法来覆盖笔记本小部件中选项卡的状态。

如果从 Solver 类调用函数,则没有问题。当从特定的 Frame/Tab 类调用登录函数时,我希望具有相同的效果。

class Solver(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self)
        self.notebook = ttk.Notebook()
        self.add_tab()
        self.notebook.pack(expand=True, fill="both")

        self.btn = tk.Button(self, text="test", command=self.loginSuccess)
        self.btn.pack()

    def add_tab(self):
        tab1 = Tab1(self.notebook)
        tab2 = Tab2(self.notebook)


        self.notebook.add(tab1, text="Menu", state="disabled")
        self.notebook.add(tab2, text="Login Page")



    def loginSuccess(self):
        self.notebook.tab(0, state="normal")
        self.notebook.tab(1, state="hidden")

        Root.geometry("380x300")

然后我有 2 个类是该笔记本标签的框架

class Tab1(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.frame1 = tk.LabelFrame(self, text="Menu", bg="light blue")
        self.frame1.pack(expand=True, fill="both")

        self.lbl = tk.Label(self.frame1, text= "test")
        self.lbl.pack()


# Login
class Tab2(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.frame1 = tk.LabelFrame(self, text="Login", bg="light blue")
        self.frame1.pack(expand=True, fill="both")

        [...]
        self.loginButton = tk.Button(self, text="  Login  ", command=self.validateLogin)
        self.loginButton.place(x=300, y=75)

    def validateLogin(self):
        pass

我需要验证登录将与 loginSuccess 执行相同的操作,但它是从另一个类调用的。

【问题讨论】:

  • “写一个合适的继承方法”是什么意思?您拥有的任何类都不是从任何其他类继承的。你只是在问如何从Tab2 内部调用loginSuccess
  • 是的,我已经从这段代码中删除了我的所有尝试,但我认为这里的主要问题是这个类继承自 tk.Tk 和 tk.Frame 不能混合。如果我想尝试这个类 Tab1(Solver,tk.Frame),然后从 Solver 调用方法,它不起作用。这就是我粘贴原始版本的原因,所以也许有解决方案可以从其他类中调用该修改。 self.notebook.tab(0, state="normal") self.notebook.tab(1, state="hidden")
  • " 认为这里的主要问题是这个类继承自 tk.Tk ,和 tk.Frame 不能混合。" 不,这不是问题。这是很常见的事情。
  • 您想从标签中调用 loginSuccess,还是让它做与loginSuccess 相同的事情
  • 两种方式都可以。

标签: python class inheritance tkinter frame


【解决方案1】:

编程的基本规则之一是您需要一个对象的引用才能调用该对象的方法。因此,如果要调用Solver 类的loginSuccess 方法,则需要引用Solver 对象。

实现这一目标的最简单方法之一是将其传递到选项卡。

首先,将solver 作为参数添加到选项卡__init__ 方法中:

class Tab2(tk.Frame):
    def __init__(self, master, solver):
        tk.Frame.__init__(self, master)
        self.solver = solver
        ...

接下来,让你的函数使用self.solver 调用loginSuccess

    def validateLogin(self):
        self.solver.loginSuccess()

最后,确保将Solver 实例传递给选项卡:

class Solver(tk.Tk):
    ...

    def add_tab(self):
        tab1 = Tab1(self.notebook)
        tab2 = Tab2(self.notebook, solver=self)

【讨论】:

    【解决方案2】:

    嗯,我找到了某种解决方案。所以我从 Solver 类中隐藏了这个按钮,当正确的凭据被添加到登录系统时,GUI 被扩展并且按钮是可见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 2016-03-16
      • 2020-07-07
      相关资源
      最近更新 更多