【问题标题】:Python - tkinter: Opening and closing dialog windowsPython - tkinter:打开和关闭对话框窗口
【发布时间】:2014-08-01 10:51:21
【问题描述】:

我对 Python 很陌生,必须编写一个简单的 GUI 程序,为了简单起见,我选择在 tkinter 中完成。

我想要的 GUI 应该与在 Windows 上安装程序时经常遇到的对话框非常相似(您想在哪里安装,您需要什么模块等)。基本上当它在python3.3中运行时,我希望出现一个窗口,其中一些选项占据了窗口的大部分,底部有“下一步”、“返回”和“取消”按钮;通过单击“下一步”按钮,当前窗口关闭并打开一个看起来相同的新窗口,除了它有不同的选项(或者它可能是同一个窗口但它的内容已被破坏,我不确定哪个会更好)。我想要的粗略布局显示在this image

我环顾四周寻找与此类似的示例代码,但没有找到。我见过this answer,但这不是我想要的。我使用this tutorial 了解了我对 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

除了它实际上并没有做我想做的事情之外,我觉得我正在以完全错误的方式(在函数中定义窗口等),并且会遇到很多麻烦我想让它更复杂。是否有人能够以更好的方式重写我的代码,并帮助我构建更复杂的程序,提供资源来学习我需要什么来制作我想要的程序,甚至提供建议?谢谢。

【问题讨论】:

    标签: python user-interface python-3.x tkinter


    【解决方案1】:

    我修改了你的例子,希望能正确理解你想要达到的目标。

    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()
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您的问题是在调用 quit() 时关闭根 Tk 窗口。不要那样做。一旦你关闭了你已经卸载了 Tk 并且它不能为你正确处理 Window 系统消息。相反,如果您想创建一个包含一系列对话框的应用程序,请通过撤回它来隐藏根窗口,并将每个对话框创建为一个新的顶层,并将隐藏的根顶层作为父级。

      【讨论】:

      • 不幸的是,我没有足够的声誉来支持您的答案,所以谢谢您就足够了。这是非常有用的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多