模态对话框处理
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))
我第一次尝试 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))