{{1}}
我对编码和堆栈溢出很新。我正在尝试创建一个GUI,它具有一个将首先打开的主页面和一个子页面,该页面将通过单击将存储在主页面中的按钮打开。我的问题是我不知道为什么它不打开我的主页面。我的想法是它与.destroy()或类似的东西有关。任何帮助将不胜感激。
答案 0 :(得分:1)
继承了一些你想要的代码..创建一个窗口,在单击按钮时将其销毁,然后创建一个新窗口......
from Tkinter import *
import random
def main_menu():
global root
root = Tk()
b = Button(root,text='our text button',command = next_page)
b.pack()
def next_page():
global root,parent
parent = Tk()
root.destroy()
new_b = Button(parent,text = 'new Button',command=print_something)
new_b.pack()
def print_something():
print('clicked')
main_menu()
root.mainloop()
parent.mainloop()
PS。我已经在python3中完成了这个,所以记住这一点,虽然它在我看来不会是一个问题
答案 1 :(得分:1)
作为一般规则,您应该在程序的生命周期中只创建一个Tk
实例。这就是Tkinter的设计用途。当你理解它背后的原因时,你可以打破这个规则,尽管很少有理由违反规则。
最简单的解决方案是将主菜单和子菜单实现为框架,这是您已经完成的。要在它们之间切换,您可以简单地销毁一个并重新创建另一个,或者提前创建它们,然后删除一个并显示另一个。
例如,以下示例显示了如何提前创建它们并简单地将它们交换出来。关键是每个函数都需要返回保存在字典中的框架。字典用于将符号名称(例如:"main"
,"sub"
等)映射到实际帧。
def main_menu(root):
menu = Frame(root)
button0 = Button(menu, text="Set Generation Zero Values",
command=lambda: switch_page("sub"))
...
return menu
def sub_menu(root):
subpage = Frame(root)
button5 = Button(subpage, text="Save Generation Data",
command = lambda: switch_page("main"))
...
return subpage
def switch_page(page_name):
slaves = root.pack_slaves()
if slaves:
# this assumes there is only one slave in the master
slaves[0].pack_forget()
pages[page_name].pack(fill="both", expand=True)
root = Tk()
pages = {
"main": main_menu(root),
"sub": sub_menu(root),
...
}
switch_page("main")
root.mainloop()
对于更复杂的面向对象方法,请参阅Switch between two frames in tkinter