无父窗口的wx.MessageDialog

1 投票
4 回答
3190 浏览
提问于 2025-04-17 21:51

有没有办法创建一个消息框(比如用 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()

撰写回答