从ClassA调用ClassB函数以隐藏ClassA小部件

时间:2019-05-03 12:18:29

标签: python tkinter

首先,如果我省略了必要的代码,我深表歉意。我是编码的初学者,这是我第一次开发GUI应用程序-我不确定是否正在显示需要帮助的内容。

我正在尝试开发一个多窗口GUI应用程序以在公司中进行数据输入。我一直在使用页面来构建页面。我目前有3个页面,每个页面都可以独立工作,并具有导入和保存数据的各种功能。现在,我试图构建一个在根窗口上隐藏所有小部件的函数,以便在不显示旧小部件的情况下创建/显示新的Toplevel。

ClassB包含我的根窗口的所有小部件。我正在尝试调用ClassA.main_continue,它想显示pageC小部件并隐藏所有root / classB小部件。

我收到错误消息“调用Python对象时超出了最大递归深度”。 Python在尝试执行标有“ ##### ... 1”和“ ##### .. 2”的行之间交替,然后退出该错误。

我花了10个小时研究和尝试各种方法来打开新窗口和隐藏旧窗口。我最终将拥有6-8个窗口,所以我想要一个单独的类,可以用来控制所有这些窗口。

import tkinter as tk

root = tk.Tk()
    top = ClassB (root)

class ClassA: #class that contains functions to control program/do tasks
    def main_continue(self, top):
        ClassC(root)
        x = ClassB(top) ################################## 1
        self.x.main_button1.place_forget()

class ClassB: #root window
    def __init__(self, top=None):
        y = ClassA()

        self.main_button1 = tk.Button(top, command= y.main_continue(top)) ######################2
        self.main_button1.pack()
        self.main_button1.place(relx=0.383, rely=0.5, height=24, width=140)
        self.main_button1.configure(text='''Continue''')

class ClassC: #2nd page
    def __init__(self, top=None):
        ## code for a different page of widgets

1 个答案:

答案 0 :(得分:0)

首先,我想在您的代码中解决您的一些问题。由于self.x.main_button1.place_forget()不存在,self.x将导致错误。您首先需要通过应用x前缀将self.定义为类属性。接下来,您在按钮上使用pack()place()。您不需要这样做。您只需要使用3个几何图形管理器之一。我的个人偏好是grid(),我认为它是最容易用于我的布局的。实际上,您可以将该按钮的4行代码减少到1行。

如果您打算使用类来构建GUI,我建议您从Tkinter类继承,例如Tk()实例和FrameToplevel

这是切换帧的超级简单示例。您可以通过多种方式来执行此操作,但这对您来说应该是一个好的开始。

import tkinter as tk


root = tk.Tk()
main_page = tk.Frame(root)
main_page.grid(row=0, column=0)
second_page = tk.Frame(root)


def show_main_page():
    second_page.grid_forget()
    main_page.grid(row=0, column=0)


def show_second_page():
    main_page.grid_forget()
    second_page.grid(row=0, column=0)

tk.Button(main_page, text='Show 2nd page', command=show_second_page).grid(row=0, column=0)
tk.Button(second_page, text='Show Main page', command=show_main_page).grid(row=0, column=0)

root.mainloop()