首先,如果我省略了必要的代码,我深表歉意。我是编码的初学者,这是我第一次开发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
答案 0 :(得分:0)
首先,我想在您的代码中解决您的一些问题。由于self.x.main_button1.place_forget()
不存在,self.x
将导致错误。您首先需要通过应用x
前缀将self.
定义为类属性。接下来,您在按钮上使用pack()
和place()
。您不需要这样做。您只需要使用3个几何图形管理器之一。我的个人偏好是grid()
,我认为它是最容易用于我的布局的。实际上,您可以将该按钮的4行代码减少到1行。
如果您打算使用类来构建GUI,我建议您从Tkinter类继承,例如Tk()
实例和Frame
或Toplevel
。
这是切换帧的超级简单示例。您可以通过多种方式来执行此操作,但这对您来说应该是一个好的开始。
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()