无父窗口的wx.MessageDialog
有没有办法创建一个消息框(比如用 wx.MessageDialog
或其他方法),而不需要一个父窗口?
举个例子,有时候我可能想在图形界面还没真正启动之前就显示一个错误信息。这样的话,我就需要在没有父窗口的情况下显示一个消息框:
如果我用 parent = None
,这样就不行:
wx.MessageDialog(parent, 'This is a message box.', 'Test', wx.OK | wx.ICON_INFORMATION).ShowModal()
怎么在没有父窗口的情况下显示消息框?
4 个回答
0
没有父窗口。
似乎没有必要使用一个框架来显示一个“独立”的对话框。这样做是可以的。(仅在Win10上测试过。)
显然,wxpython把这个对话框(其实它也只是一个窗口)当作显示的“框架”。
import wx
# -------------------------------------------------------
def wx_ask_question_windowed(question, caption):
app = wx.App()
dlg = wx.MessageDialog(None, question, caption, wx.YES_NO | wx.ICON_INFORMATION)
dlg.Center()
dlg_result = dlg.ShowModal()
result = dlg_result == wx.ID_YES
dlg.Destroy()
app.MainLoop()
app.Destroy()
return result
# ==============================================================
def main():
if wx_ask_question_windowed('Do you like this?', 'A windowed question'):
print('You like it')
else:
print("You don't like it")
# ==============================================================
if __name__ == '__main__':
main()
1
我知道这个问题有点老了,但我觉得把parent设置为None并不会像大家想的那样工作。想象一下上面的例子,不过先显示wx.Frame,然后再显示wx.MessageDialog,像这样:
import wx
app = wx.App()
frame = wx.Frame(None)
frame.Center()
frame.Show()
wx.MessageDialog(None, 'This is a message box.', 'Test', wx.OK | wx.ICON_INFORMATION).ShowModal()
app.MainLoop()
结果是一个wx.Frame,上面有一个wx.MessageDialog(这没问题),但是wx.Frame不能被调整大小或者拖动到屏幕的其他地方(这就有点奇怪了)。而wx.MessageDialog可以在屏幕上拖动,但它会跟着wx.Frame一起移动(这也不太正常)。这两个窗口显然不是独立工作的,似乎wx.MessageDialog是被wx.Frame控制的。因此,我觉得wxPython在这里做了一些不太明显的处理;至少我在文档里没有看到相关的说明。
3
我刚看到这个老问题,想来回答一下,迟到总比不来好:
默认情况下,主应用窗口会被当作对话框的父窗口,即使你没有特别指定一个父窗口,因为在99%的情况下,这样做是你想要的——没有父窗口的模态对话框是相当少见的。如果你真的非常需要让对话框没有父窗口,你必须明确使用 wx.DIALOG_NO_PARENT
这个样式。
2
应该可以的,试试这个:
import wx
app = wx.App()
wx.MessageDialog(None, 'This is a message box.', 'Test', wx.OK | wx.ICON_INFORMATION).ShowModal()
frame = wx.Frame(None)
frame.Center()
frame.Show()
app.MainLoop()