【问题标题】:Python Tkinter - Close dialog without closing main windowPython Tkinter - 关闭对话框而不关闭主窗口
【发布时间】:2016-01-27 17:45:34
【问题描述】:

我正在尝试使用 Tkinter (Python 3.5) 创建一个文本输入对话框,但我遇到了一些问题。这是我的代码:

class TextEntryDialog:
    def __init__(self, master):
        self.top = Toplevel(master)
        self.textField = Entry()
        self.textField.pack()

root = Tk()
ted = TextEntryDialog(root)
root.mainloop()

当我运行它时,我会得到一个我想要的对话框和一个主窗口,但问题是当我关闭对话框时,主窗口也会关闭。我希望在对话框关闭时主窗口保持打开状态,谁能帮我解决这个问题?

【问题讨论】:

  • 你是如何关闭对话框的?如果你这样做 ted.destroy() 它不应该关闭主窗口。
  • 你会得到一些你认为不同的东西——MainWindow 是一个你认为是TextEntryDialog 的窗口。您将Entry 添加到MainWindow,因为您没有在Entry 中使用父级。你关闭了MainWindow,但你认为你关闭了TextEntryDialog

标签: python tkinter


【解决方案1】:

将标题添加到窗口,您会看到

您将Entry 添加到MainWindow
你关闭了MainWindow,但你认为它是TextEntryDialog

您必须在Entry 中添加self.top (Toplevel) 作为parent 才能将其放入正确的窗口中。

self.textField = Entry(self.top)

.

from tkinter import *

class TextEntryDialog:
    def __init__(self, master):
        self.top = Toplevel(master)
        self.top.title("TextEntryDialog")

        self.textField = Entry(self.top) # parent
        self.textField.pack()

root = Tk()
root.title("MainWindow")
ted = TextEntryDialog(root)
root.mainloop()

【讨论】:

    【解决方案2】:

    您可能想要重组您的代码。下面的示例应用程序演示了如何打开一个用于文本输入的对话框,并在对话框完成执行时防止主窗口关闭:

    from tkinter import Label, NoDefaultRoot, Tk
    from tkinter.font import Font
    from tkinter.simpledialog import askstring
    
    
    def main():
        NoDefaultRoot()
        root = Tk()
        root.title('Demonstration')
        root.resizable(False, False)
        Label(root, font=Font(root, size=24)).grid()
        root.after_idle(animate_label, root, 3)
        root.mainloop()
    
    
    def animate_label(root, time_left):
        label = get_any_child(root, Label)
        label['text'] = 'Opening a dialog in {} ...'.format(max(time_left, 0))
        if time_left > 0:
            root.after(1000, animate_label, root, time_left - 1)
        else:
            root.after_idle(open_dialog, root)
    
    
    def get_any_child(widget, kind):
        return get_any(get_children(widget), kind)
    
    
    def get_children(widget):
        return iter(widget.children.values())
    
    
    def get_any(iterable, kind):
        return next(item for item in iterable if isinstance(item, kind))
    
    
    def open_dialog(root):
        answer = askstring('Text Entry', 'Who are you?', parent=root)
        label = get_any_child(root, Label)
        if answer:
            label['text'] = 'You are {}.'.format(answer)
        else:
            label['text'] = 'I must find out who you are.'
            root.after(3000, open_dialog, root)
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      相关资源
      最近更新 更多