tkinter(不确定我的错误可能是由于.destroy())

时间:2016-07-12 10:20:09

标签: python python-2.7 tkinter

{{1}}

我对编码和堆栈溢出很新。我正在尝试创建一个GUI,它具有一个将首先打开的主页面和一个子页面,该页面将通过单击将存储在主页面中的按钮打开。我的问题是我不知道为什么它不打开我的主页面。我的想法是它与.destroy()或类似的东西有关。任何帮助将不胜感激。

2 个答案:

答案 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