如何在继续使用tkinter之前等待模态窗口的响应?

时间:2016-07-30 20:55:22

标签: python tkinter modal-dialog

我有一个python程序,我在其中创建了一些自定义模式窗口,它们是顶级tkinter窗口的子窗口。下面是这样一个窗口的一个例子,但我有其他更复杂的窗口。我想做什么,但无法确定如何,在某个地方,我称之为等待响应。我尝试过类似下面的内容,但无法创建窗口

modal = ModalWindow(tk.Tk(), 'Title', 'Text')
while modal.choice is None:
    pass
if modal.choice == 'Yes':
    # Do Something

处理此类事情的适当方法是什么?

自定义模态窗口示例

class ModalWindow(object):

    def __init__(self, root, title, text):
        self.choice = None

        # Setup the window
        self.modalWindow = tk.Toplevel(root)
        self.modalWindow.title(title)
        self.modalWindow.resizable(False, False)

        # Setup the widgets in the window
        label = ttk.Label(self.modalWindow, text = text, font = '-size 10')
        label.grid(row = 0, column = 0, columnspan = 2, padx = 2, pady = 2)

        but = ttk.Button(self.modalWindow, text = 'Yes', command = self.choiceYes)
        but.grid(row = 1, column = 0, sticky = 'nsew', padx = 2, pady = 5)

        but = ttk.Button(self.modalWindow, text = 'No', command = self.choiceNo)
        but.grid(row = 1, column = 1, sticky = 'nsew', padx = 2, pady = 5)

        self.modalWindow.rowconfigure(1, minsize = 40)

    def choiceYes(self):
        self.choice = 'Yes'
        self.modalWindow.destroy()

    def choiceNo(self):
        self.choice = 'No'
        self.modalWindow.destroy()

2 个答案:

答案 0 :(得分:1)

经过进一步的挖掘,我找到了自己的答案。以下是我想要的。函数wait_window接受tkinter窗口并暂停,直到该窗口关闭。

root = tk.Tk()
modal = ModalWindow(root, 'Title', 'Text')
root.wait_window(modal.modalWindow)
if modal.choice == 'Yes':
    # Do Something

答案 1 :(得分:0)

我在这里缺少一些基本的东西。如果窗口是应用程序模式,那么您将被迫等待:没有任何程序化要做。如果你正在尝试等待属于另一个应用程序的窗口中发生的事件,除非你编写一些棘手的OLE代码(我在这里假设Windows,因为UNIX做事的方式永远不会导致前夕考虑)这样的解决方案组件)。