模态对话框处理

Modal dialog disposal

我第一次尝试 wxPython 在 xterm 中使用迄今为止仅用于控制台的程序 运行 在 Debian box 的 X11/KDE 环境中弹出一个简单的确认对话框.如果检测到 wx(导入 wx 成功),我的脚本使用此函数来询问简单的 yes/no 问题:

def md (prompt='Continue or cancel'):
    wa = wx.App()
    confd = wx.MessageDialog(None,prompt,'YND',
                             wx.OK | wx.CANCEL | wx.ICON_QUESTION)
    confr = confd.ShowModal()
    return confr == wx.ID_OK

这与 expected/desired 一样,显示对话框并正确检测输入。但是 window 在使用后仍然存在。它不会消失,直到 Python 脚本结束。我已经尝试了无数种方法来理解行为并确定 proper/accepted/canonical 方法使 window 在适当的时候消失但没有成功。如果我随后再次调用 showModal() ,唯一的部分成功会发生,在这种情况下,window 将替换为一个新对话框 - 显然不是一个可接受的解决方案。

希望在我开始研究 tkinter 之前,有人会看到我的一些明显愚蠢的错误。

更新 - 在 windows 10、wxpython 4.1a、python 3.6.8

上测试

您有一个有趣的 wx 用例。设计的对话框在关闭时不会被破坏。您必须显式调用 Destroy() 或在上下文管理器中使用它们(在退出时调用销毁)。以下是两个尝试解决您的问题的示例:

import wx


def md_1(prompt="Continue or cancel"):
    ret_code = [None]

    def show_dialog():
        with wx.MessageDialog(frame, prompt, 'YND', wx.OK | wx.CANCEL | wx.ICON_QUESTION) as dialog:
            ret_code[0] = dialog.ShowModal()
        frame.Close()

    app = wx.App()

    frame = wx.Frame(None)
    wx.CallAfter(show_dialog)
    app.MainLoop()
    return ret_code[0] == wx.ID_OK


def md_2(prompt="Continue or cancel"):
    app = wx.App()

    with wx.MessageDialog(None, prompt, 'YND', wx.OK | wx.CANCEL | wx.ICON_QUESTION) as dialog:
        ret = dialog.ShowModal()
    app.Destroy()
    return ret == wx.ID_OK


if __name__ == "__main__":
    answer = md_1()
    input("answer #1 was {0}".format(answer))
    answer = md_2()
    input("answer #2 was {0}".format(answer))