Python - tkinter: 打开和关闭对话窗口
我刚开始学习Python,需要写一个简单的图形界面程序,选择用tkinter来实现,因为这样比较简单。
我想要的界面应该和在Windows上安装程序时遇到的对话框很相似(比如你想安装到哪里,选择哪些模块等等)。基本上,当我在python3.3中运行时,我希望能出现一个窗口,窗口大部分地方是一些选项,底部有“下一步”、“返回”和“取消”按钮;点击“下一步”按钮后,当前窗口关闭,打开一个新的窗口,样子一样,只是选项不同(或者可能是同一个窗口,但内容被清空了,我不太确定哪种方式更好)。我想要的大致布局可以参考这张图片
我找了一些示例代码,想要实现类似的功能,但没有找到合适的。我看到过这个回答,但并不是我想要的。我用这个教程学习了tkinter,但在里面找不到我需要的答案。
这是我非常糟糕的尝试,想要简化我想做的事情:当我运行代码时,它创建了一个有两个按钮的窗口。“退出”按钮工作正常;但是,当我点击“下一步”按钮时,它关闭了窗口并打开了一个新窗口,虽然这是我想要的,但它还打开了另一个窗口。
from tkinter import *
from tkinter import ttk
def win1():
mainframe = ttk.Frame(root, padding = '3 3 12 12')
mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S))
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
ttk.Button(mainframe, text = 'Next', command = win2).grid(
column = 1, row = 1, sticky = W)
ttk.Button(mainframe, text = 'Quit', command = quit).grid(
column = 1, row = 2, sticky = W)
root.mainloop()
def quit():
root.destroy()
def win2():
quit()
new = Toplevel()
new.title('Window 2')
new = ttk.Frame(root, padding = '3 3 12 12')
new.grid(column = 0, row = 0, sticky = (N, W, E, S))
new.columnconfigure(0, weight = 1)
new.rowconfigure(0, weight = 1)
ttk.Button(mainframe, text = 'Next', command = win2).grid(
column = 1, row = 1, sticky = W)
root = Tk()
win1()
这给出了以下错误信息(我不太明白):
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.3/tkinter/__init__.py", line 1478, in __call__
return self.func(*args)
File "<stdin>", line 23, in win2
File "/usr/lib/python3.3/tkinter/ttk.py", line 733, in __init__
Widget.__init__(self, master, "ttk::frame", kw)
File "/usr/lib/python3.3/tkinter/ttk.py", line 553, in __init__
tkinter.Widget.__init__(self, master, widgetname, kw=kw)
File "/usr/lib/python3.3/tkinter/__init__.py", line 2078, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: this isn't a Tk applicationNULL main window
除了它并没有真正做到我想要的之外,我感觉我完全走错了方向(在一个函数中定义窗口等等),当我想让它变得更复杂时会遇到很多麻烦。有没有人能帮我重写我的代码,让它更好,并且能帮助我构建更复杂的程序,或者提供一些学习资源,教我如何制作我想要的程序,或者给我一些建议?谢谢。
2 个回答
你遇到的问题是,当你调用 quit() 时,关闭了根 Tk 窗口。这样做是不对的。一旦你关闭了这个窗口,Tk 就无法正常处理窗口系统的消息了。如果你想做一个包含多个对话框的应用程序,可以选择隐藏根窗口,而不是关闭它。然后,每次创建对话框时,作为新窗口创建,并把隐藏的根窗口作为它的父窗口。
我对你的例子做了一些修改,希望能正确理解你想要实现的目标。
from tkinter import *
from tkinter import ttk
def win1():
mainframe = ttk.Frame(root, padding = '3 3 12 12')
mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S))
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
ttk.Button(mainframe, text = 'Next', command = win2).grid(
column = 1, row = 1, sticky = W)
ttk.Button(mainframe, text = 'Quit', command = quit).grid(
column = 1, row = 2, sticky = W)
root.mainloop()
def quit():
root.destroy()
def win2():
root.withdraw()
new = Toplevel()
new.title('Window 2')
mainframe = ttk.Frame(new, padding = '3 3 12 12')
mainframe.grid(column = 0, row = 0, sticky = (N, W, E, S))
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
ttk.Button(mainframe, text = 'Next', command = win2).grid(
column = 1, row = 1, sticky = W)
root = Tk()
win1()
希望这对你有帮助。