簡體   English   中英

Python Tkinter-關閉對話框而不關閉主窗口

[英]Python Tkinter - Close dialog without closing main window

我正在嘗試使用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()

運行此命令時,我會得到一個對話框和一個主窗口,但問題是當我關閉對話框時,主窗口也會關閉。 對話框關閉時,我希望主窗口保持打開狀態,有人可以幫我嗎?

在Windows中添加標題,您會看到

在此處輸入圖片說明

您將Entry添加到MainWindow
然后關閉MainWindow但您認為它是TextEntryDialog

您必須在Entry添加self.topToplevel )作為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()

您可能需要重組代碼。 下面的示例應用程序演示了如何打開一個用於輸入文本的對話框以及如何在對話框執行完后防止關閉主窗口:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM