原文: http://zetcode.com/wxpython/dialogs/

对话框窗口或对话框是大多数现代 GUI 应用必不可少的部分。 对话被定义为两个或更多人之间的对话。 在计算机应用中,对话框是一个窗口,用于与应用“对话”。 对话框用于输入数据,修改数据,更改应用设置等。对话框是用户与计算机程序之间进行通信的重要手段。

一个简单的消息框

一个消息框向用户提供简短信息。 一个很好的例子是 CD 刻录应用。 CD 刻录完成后,将弹出一个消息框。

message_box.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This example shows a simple
  6. message box.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: April 2018
  10. """
  11. import wx
  12. class Example(wx.Frame):
  13. def __init__(self, *args, **kwargs):
  14. super(Example, self).__init__(*args, **kwargs)
  15. self.InitUI()
  16. def InitUI(self):
  17. wx.CallLater(3000, self.ShowMessage)
  18. self.SetSize((300, 200))
  19. self.SetTitle('Message box')
  20. self.Centre()
  21. def ShowMessage(self):
  22. wx.MessageBox('Download completed', 'Info',
  23. wx.OK | wx.ICON_INFORMATION)
  24. def main():
  25. app = wx.App()
  26. ex = Example(None)
  27. ex.Show()
  28. app.MainLoop()
  29. if __name__ == '__main__':
  30. main()

此示例显示三秒钟后的消息框。

  1. wx.CallLater(3000, self.ShowMessage)

wx.CallLater在三秒钟后调用一个方法。 第一个参数是时间值,之后将调用给定方法。 该参数以毫秒为单位。 第二个参数是要调用的方法。

  1. def ShowMessage(self):
  2. wx.MessageBox('Download completed', 'Info',
  3. wx.OK | wx.ICON_INFORMATION)

wx.MessageBox显示一个小的对话框窗口。 我们提供了三个参数:文本消息,标题消息和标志。 这些标志用于显示不同的按钮和图标。 在本例中,我们显示一个确定按钮和信息图标。

wxPython 对话框 - 图1

图:一个消息框

预定义对话框

wxPython 有几个预定义的对话框。 这些是用于常见编程任务的对话框,例如显示文本,接收输入,加载和保存文件。

MessageDialog

消息对话框用于向用户显示消息。 它们比我们在前面的示例中看到的简单消息框更加灵活。 它们是可定制的。 我们可以更改将在对话框中显示的图标和按钮。

标志 含义
wx.OK 显示确定按钮
wx.CANCEL 显示取消按钮
wx.YES_NO 显示是,否按钮
wx.YES_DEFAULT 将是按钮设为默认
wx.NO_DEFAULT 将无按钮设为默认
wx.ICON_EXCLAMATION 显示警报图标
wx.ICON_ERROR 显示错误图标
wx.ICON_HAND wx.ICON_ERROR相同
wx.ICON_INFORMATION 显示信息图标
wx.ICON_QUESTION 显示问题图标

这些是可以与wx.MessageDialog类一起使用的标志。

message_dialogs.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode wxPython tutorial
  5. This example shows four types of
  6. message dialogs.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: April 2018
  10. """
  11. import wx
  12. class Example(wx.Frame):
  13. def __init__(self, *args, **kwargs):
  14. super(Example, self).__init__(*args, **kwargs)
  15. self.InitUI()
  16. def InitUI(self):
  17. panel = wx.Panel(self)
  18. hbox = wx.BoxSizer()
  19. sizer = wx.GridSizer(2, 2, 2, 2)
  20. btn1 = wx.Button(panel, label='Info')
  21. btn2 = wx.Button(panel, label='Error')
  22. btn3 = wx.Button(panel, label='Question')
  23. btn4 = wx.Button(panel, label='Alert')
  24. sizer.AddMany([btn1, btn2, btn3, btn4])
  25. hbox.Add(sizer, 0, wx.ALL, 15)
  26. panel.SetSizer(hbox)
  27. btn1.Bind(wx.EVT_BUTTON, self.ShowMessage1)
  28. btn2.Bind(wx.EVT_BUTTON, self.ShowMessage2)
  29. btn3.Bind(wx.EVT_BUTTON, self.ShowMessage3)
  30. btn4.Bind(wx.EVT_BUTTON, self.ShowMessage4)
  31. self.SetSize((300, 200))
  32. self.SetTitle('Messages')
  33. self.Centre()
  34. def ShowMessage1(self, event):
  35. dial = wx.MessageDialog(None, 'Download completed', 'Info', wx.OK)
  36. dial.ShowModal()
  37. def ShowMessage2(self, event):
  38. dial = wx.MessageDialog(None, 'Error loading file', 'Error',
  39. wx.OK | wx.ICON_ERROR)
  40. dial.ShowModal()
  41. def ShowMessage3(self, event):
  42. dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question',
  43. wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
  44. dial.ShowModal()
  45. def ShowMessage4(self, event):
  46. dial = wx.MessageDialog(None, 'Unallowed operation', 'Exclamation',
  47. wx.OK | wx.ICON_EXCLAMATION)
  48. dial.ShowModal()
  49. def main():
  50. app = wx.App()
  51. ex = Example(None)
  52. ex.Show()
  53. app.MainLoop()
  54. if __name__ == '__main__':
  55. main()

在我们的示例中,我们创建了四个按钮并将它们放入网格大小调整器中。 这些按钮将显示四个不同的对话框窗口。 我们通过指定不同的样式标志来创建它们。

  1. def ShowMessage2(self, event):
  2. dial = wx.MessageDialog(None, 'Error loading file', 'Error',
  3. wx.OK | wx.ICON_ERROR)
  4. dial.ShowModal()

消息对话框的创建很简单。 通过将None作为父级,将对话框设置为顶级窗口。 这两个字符串提供了消息文本和对话框标题。 通过指定wx.OKwx.ICON_ERROR标志,我们显示一个 OK 按钮和一个错误图标。 为了在屏幕上显示对话框,我们调用ShowModal()方法。

AboutDialog

几乎每个应用都有一个典型的“关于”对话框。 通常将其放在“帮助”菜单中。 该对话框的目的是向用户提供有关应用名称和版本的基本信息。 过去,这些对话框非常简短。 如今,这些框中的大多数都提供了有关作者的其他信息。 他们感谢其他程序员或文档编写者。 他们还提供有关应用许可证的信息。 这些框可以显示公司徽标或应用徽标。

为了创建一个关于对话框,我们必须创建两个对象。 一个wx.adv.AboutDialogInfo和一个wx.adv.AboutBox

wxPython 可以显示两种“关于”框。 这取决于我们使用的平台和调用的方法。 它可以是本机对话框,也可以是 wxPython 通用对话框。 Windows 本机“关于”对话框无法显示自定义图标,许可证文本或 URL。 如果我们省略这三个字段,则 wxPython 将显示一个本机对话框。 否则,它将诉诸通用。 如果我们想保持本地化,建议在单独的菜单项中提供许可证信息。 GTK+ 可以显示所有这些字段。

about_dialog.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. '''
  4. ZetCode wxPython tutorial
  5. In this example, we create an
  6. about dialog box.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: April 2018
  10. '''
  11. import wx
  12. import wx.adv
  13. class Example(wx.Frame):
  14. def __init__(self, *args, **kwargs):
  15. super(Example, self).__init__(*args, **kwargs)
  16. self.InitUI()
  17. def InitUI(self):
  18. menubar = wx.MenuBar()
  19. help = wx.Menu()
  20. help.Append(wx.ID_ANY, '&About')
  21. help.Bind(wx.EVT_MENU, self.OnAboutBox)
  22. menubar.Append(help, '&Help')
  23. self.SetMenuBar(menubar)
  24. self.SetSize((350, 250))
  25. self.SetTitle('About dialog box')
  26. self.Centre()
  27. def OnAboutBox(self, e):
  28. description = """File Hunter is an advanced file manager for
  29. the Unix operating system. Features include powerful built-in editor,
  30. advanced search capabilities, powerful batch renaming, file comparison,
  31. extensive archive handling and more.
  32. """
  33. licence = """File Hunter is free software; you can redistribute
  34. it and/or modify it under the terms of the GNU General Public License as
  35. published by the Free Software Foundation; either version 2 of the License,
  36. or (at your option) any later version.
  37. File Hunter is distributed in the hope that it will be useful,
  38. but WITHOUT ANY WARRANTY; without even the implied warranty of
  39. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  40. See the GNU General Public License for more details. You should have
  41. received a copy of the GNU General Public License along with File Hunter;
  42. if not, write to the Free Software Foundation, Inc., 59 Temple Place,
  43. Suite 330, Boston, MA 02111-1307 USA"""
  44. info = wx.adv.AboutDialogInfo()
  45. info.SetIcon(wx.Icon('hunter.png', wx.BITMAP_TYPE_PNG))
  46. info.SetName('File Hunter')
  47. info.SetVersion('1.0')
  48. info.SetDescription(description)
  49. info.SetCopyright('(C) 2007 - 2019 Jan Bodnar')
  50. info.SetWebSite('http://www.zetcode.com')
  51. info.SetLicence(licence)
  52. info.AddDeveloper('Jan Bodnar')
  53. info.AddDocWriter('Jan Bodnar')
  54. info.AddArtist('The Tango crew')
  55. info.AddTranslator('Jan Bodnar')
  56. wx.adv.AboutBox(info)
  57. def main():
  58. app = wx.App()
  59. ex = Example(None)
  60. ex.Show()
  61. app.MainLoop()
  62. if __name__ == '__main__':
  63. main()

该示例有一个关于菜单项。 选择项目后,将显示关于框。

  1. description = """File Hunter is an advanced file manager for
  2. the Unix operating system. Features include powerful built-in editor,
  3. advanced search capabilities, powerful batch renaming, file comparison,
  4. extensive archive handling and more.
  5. """

最好不要在应用的代码中放入太多文本。 我们不想使示例过于复杂,因此我们将所有文本放入代码中。 但是在实际程序中,文本应单独放置在文件中。 它有助于我们维护应用。 例如,如果我们想将我们的应用翻译成其他语言。

  1. info = wx.adv.AboutDialogInfo()

首先要做的是创建一个wx.AboutDialogInfo对象。 构造器为空。 它不接受任何参数。

  1. info.SetIcon(wx.Icon('hunter.png', wx.BITMAP_TYPE_PNG))
  2. info.SetName('File Hunter')
  3. info.SetVersion('1.0')
  4. info.SetDescription(description)
  5. info.SetCopyright('(C) 2007 - 2014 Jan Bodnar')
  6. info.SetWebSite('http://www.zetcode.com')
  7. info.SetLicence(licence)
  8. info.AddDeveloper('Jan Bodnar')
  9. info.AddDocWriter('Jan Bodnar')
  10. info.AddArtist('The Tango crew')
  11. info.AddTranslator('Jan Bodnar')

下一步是在创建的wx.AboutDialogInfo对象上调用所有必需的方法。

  1. wx.adv.AboutBox(info)

最后,我们创建一个wx.adv.AboutBox小部件。 它唯一需要的参数是wx.adv.AboutDialogInfo对象。

wxPython 对话框 - 图2

图:关于对话框

自定义对话框

在下一个示例中,我们创建一个自定义对话框。 图像编辑应用可以更改图片的颜色深度。 为了提供这种功能,我们可以创建一个合适的对话框。

custom_dialog.py

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. '''
  4. ZetCode wxPython tutorial
  5. In this code example, we create a
  6. custom dialog.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: April 2018
  10. '''
  11. import wx
  12. class ChangeDepthDialog(wx.Dialog):
  13. def __init__(self, *args, **kw):
  14. super(ChangeDepthDialog, self).__init__(*args, **kw)
  15. self.InitUI()
  16. self.SetSize((250, 200))
  17. self.SetTitle("Change Color Depth")
  18. def InitUI(self):
  19. pnl = wx.Panel(self)
  20. vbox = wx.BoxSizer(wx.VERTICAL)
  21. sb = wx.StaticBox(pnl, label='Colors')
  22. sbs = wx.StaticBoxSizer(sb, orient=wx.VERTICAL)
  23. sbs.Add(wx.RadioButton(pnl, label='256 Colors',
  24. style=wx.RB_GROUP))
  25. sbs.Add(wx.RadioButton(pnl, label='16 Colors'))
  26. sbs.Add(wx.RadioButton(pnl, label='2 Colors'))
  27. hbox1 = wx.BoxSizer(wx.HORIZONTAL)
  28. hbox1.Add(wx.RadioButton(pnl, label='Custom'))
  29. hbox1.Add(wx.TextCtrl(pnl), flag=wx.LEFT, border=5)
  30. sbs.Add(hbox1)
  31. pnl.SetSizer(sbs)
  32. hbox2 = wx.BoxSizer(wx.HORIZONTAL)
  33. okButton = wx.Button(self, label='Ok')
  34. closeButton = wx.Button(self, label='Close')
  35. hbox2.Add(okButton)
  36. hbox2.Add(closeButton, flag=wx.LEFT, border=5)
  37. vbox.Add(pnl, proportion=1,
  38. flag=wx.ALL|wx.EXPAND, border=5)
  39. vbox.Add(hbox2, flag=wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, border=10)
  40. self.SetSizer(vbox)
  41. okButton.Bind(wx.EVT_BUTTON, self.OnClose)
  42. closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
  43. def OnClose(self, e):
  44. self.Destroy()
  45. class Example(wx.Frame):
  46. def __init__(self, *args, **kw):
  47. super(Example, self).__init__(*args, **kw)
  48. self.InitUI()
  49. def InitUI(self):
  50. tb = self.CreateToolBar()
  51. tb.AddTool(toolId=wx.ID_ANY, label='', bitmap=wx.Bitmap('color.png'))
  52. tb.Realize()
  53. tb.Bind(wx.EVT_TOOL, self.OnChangeDepth)
  54. self.SetSize((350, 250))
  55. self.SetTitle('Custom dialog')
  56. self.Centre()
  57. def OnChangeDepth(self, e):
  58. cdDialog = ChangeDepthDialog(None,
  59. title='Change Color Depth')
  60. cdDialog.ShowModal()
  61. cdDialog.Destroy()
  62. def main():
  63. app = wx.App()
  64. ex = Example(None)
  65. ex.Show()
  66. app.MainLoop()
  67. if __name__ == '__main__':
  68. main()

在上面的示例中,我们创建了一个自定义对话框。

  1. class ChangeDepthDialog(wx.Dialog):
  2. def __init__(self, *args, **kw):
  3. super(ChangeDepthDialog, self).__init__(*args, **kw)

在我们的代码示例中,我们创建了一个自定义的ChangeDepthDialog对话框。 我们继承自wx.Dialog小部件。

  1. def OnChangeDepth(self, e):
  2. cdDialog = ChangeDepthDialog(None,
  3. title='Change Color Depth')
  4. cdDialog.ShowModal()
  5. cdDialog.Destroy()

我们实例化一个ChangeDepthDialog class。 然后我们调用ShowModal()方法。 稍后,我们必须使用Destroy()销毁对话框。请注意,对话框和顶层窗口之间的视觉差异。 下图的对话框已激活。 在对话框被销毁之前,我们无法使用顶层窗口。 窗口的标题栏有明显的区别。

wxPython 对话框 - 图3

图:一个自定义对话框

在本章中,我们介绍了对话框。