【问题标题】:wx.MessageDialog without parent windowwx.MessageDialog 没有父窗口
【发布时间】:2014-03-11 23:08:26
【问题描述】:

是否可以在没有父窗口的情况下创建一个消息框(带有wx.MessageDialog 或其他任何东西)?

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

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

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

如何在没有父窗口的情况下显示消息框?

【问题讨论】:

  • 应该可以,但是您需要确保主事件循环正在运行,而这通常还没有运行。你也可以从 wxSplashScreen 得到一些提示。 ,
  • 你是对的@CorleyBrigman:也许我之前做错了什么,现在它可以工作了......

标签: python user-interface wxpython wxwidgets


【解决方案1】:

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

默认情况下,即使没有明确指定父级,主应用程序窗口也会用作对话框父级,因为这在 99% 的情况下都是您想要的——没有父/所有者窗口的模态对话框是非常不寻常的。如果您真的非常需要阻止对话框拥有父级,则必须明确使用wx.DIALOG_NO_PARENT 样式。

【讨论】:

  • 这在从 wxPython 2.8 迁移时尤其重要 :)
【解决方案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()

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但我相信 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 应用了一些不明显的魔法。至少我在文档中看不到任何内容。

    【讨论】:

      【解决方案4】:

      没有父框架。

      似乎不需要使用框架来显示“独立”对话框。这工作正常。 (仅在 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()
      

      【讨论】:

        猜你喜欢
        • 2016-12-20
        • 2011-04-16
        • 2014-06-12
        • 2012-06-30
        • 2010-10-05
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        相关资源
        最近更新 更多