没有父窗口的wx.MessageDialog

时间:2014-03-11 23:08:27

标签: python user-interface wxpython wxwidgets

是否可以在没有父窗口的情况下创建一个消息框(包含wx.MessageDialog或其他内容)?

例如,我有时可能希望在GUI真正启动之前显示错误消息。然后我需要能够显示一个消息框之前有一个父窗口:

使用parent = None,这不起作用:

wx.MessageDialog(parent, 'This is a message box.', 'Test', wx.OK | wx.ICON_INFORMATION).ShowModal()

如何显示没有父窗口的消息框?

4 个答案:

答案 0 :(得分:2)

刚刚看到了这个老问题,想回答这个问题,迟到总比没有好:

默认情况下,即使未明确指定父级,主应用程序窗口也将用作对话框的父级,因为这是您在99%的情况下所需的-没有父级/所有者窗口的模态对话框非常不常见。如果确实需要防止对话框中有父级对话框,则必须显式使用wx.DIALOG_NO_PARENT样式。

答案 1 :(得分:1)

它应该有效,试试这个:

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()

答案 2 :(得分: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.MessageDialog随其移动(这是不希望的)。显然,这两个框架不是彼此独立地工作的,并且wx.MessageDialog似乎由wx.Frame拥有。因此,我认为wxPython应用了一些不太明显的魔术。至少我看不到文档中的任何内容。

答案 3 :(得分: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()