总目录:wxPython 教程目录 本节内容:wxPython 对话框 dialog 本节译自:zetcode 上一篇:wxpython 教程 (五): 事件 下一篇:wxpython 教程 (七): 部件
对话框即 Dialog 是多数 GUI 应用不可缺少的部分。“对话”是指两个或更多人之间的交谈。在电脑应用中,对话框是指一个可以和应用交流的窗口,可以用来输入数据、修改数据、修改应用设置等。因此,对话框是用户和电脑程序交流的重要手段。本节我们主要对 wxPython 对话框 进行讲解。
一个简单的 wxPython 消息框
消息框可以给用户提供简单的信息,一个较好的例子是 CD 的刻录应用,当 CD 刻录完毕后会弹出一个消息框。
#!/usr/bin/python # -*- coding: utf-8 -*- ''' Translated By Achen 2017/9 === ZetCode wxPython tutorial This example shows a simple message box. author: Jan Bodnar website: www.zetcode.com last modified: October 2011 ''' import wx class Example(wx.Frame): def __init__(self, *args, **kwargs): super(Example, self).__init__(*args, **kwargs) self.InitUI() def InitUI(self): wx.FutureCall(5000, self.ShowMessage) self.SetSize((300, 200)) self.SetTitle('Message box') self.Centre() self.Show(True) def ShowMessage(self): wx.MessageBox('Download completed', 'Info', wx.OK | wx.ICON_INFORMATION) def main(): ex = wx.App() Example(None) ex.MainLoop() if __name__ == '__main__': main()
这个例子在5秒后会展示一个消息框。
wx.FutureCall(5000, self.ShowMessage)
wx.FutureCall 在5秒后会调用某个方法。第一个参数是时间值,单位是毫秒;第二个参数是被调用的方法。
def ShowMessage(self): wx.MessageBox('Download completed', 'Info', wx.OK | wx.ICON_INFORMATION)
wx.MessageBox 展示了一个小的对话框,其中三个参数,第一个为消息内容,第二个是标题,第三个是一些标记,用来展示不同的按钮和图标。在这个例子中,我们展示了一个 OK 按键和一个 Information 图标。
图:一个消息框
预定义 wxPython 对话框
wxPython 有多个预定义的对话框,这些对话框可以完成一些通用功能,比如展示文本、获取输入、载入以及保存文件等。
消息对话框
消息对话框用来给用户展示消息,它们比上面见过的简单消息框 (message box)更加灵活,可定制更多特性,我们可以更改图标或者按钮等。
标记 | 作用 |
---|---|
wx.OK | 展示 OK 键 |
wx.CANCEL | 展示 Cancel 键 |
wx.YES_NO | 展示 Yes 和 No 键 |
wx.YES_DEFAULT | 使用默认 Yes 键 |
wx.NO_DEFAULT | 使用默认 No 键 |
wx.ICON_EXCLAMATION | 展示一个 alert 图标 |
wx.ICON_ERROR | 展示一个 error 图标 |
wx.ICON_HAND | 与 wx.ICON_ERROR 一样 |
wx.ICON_INFORMATION | 展示一个 info 图标 |
wx.ICON_QUESTION | 展示一个 question 图标 |
上表的各类标记均可以应用于 wx.MessageDialog 类。
#!/usr/bin/python # -*- coding: utf-8 -*- ''' ZetCode wxPython tutorial This example shows four types of message dialogs. author: Jan Bodnar website: www.zetcode.com last modified: October 2011 ''' import wx class Example(wx.Frame): def __init__(self, *args, **kwargs): super(Example, self).__init__(*args, **kwargs) self.InitUI() def InitUI(self): panel = wx.Panel(self) hbox = wx.BoxSizer() sizer = wx.GridSizer(2, 2, 2, 2) btn1 = wx.Button(panel, label='Info') btn2 = wx.Button(panel, label='Error') btn3 = wx.Button(panel, label='Question') btn4 = wx.Button(panel, label='Alert') sizer.AddMany([btn1, btn2, btn3, btn4]) hbox.Add(sizer, 0, wx.ALL, 15) panel.SetSizer(hbox) btn1.Bind(wx.EVT_BUTTON, self.ShowMessage1) btn2.Bind(wx.EVT_BUTTON, self.ShowMessage2) btn3.Bind(wx.EVT_BUTTON, self.ShowMessage3) btn4.Bind(wx.EVT_BUTTON, self.ShowMessage4) self.SetSize((300, 200)) self.SetTitle('Messages') self.Centre() self.Show(True) def ShowMessage1(self, event): dial = wx.MessageDialog(None, 'Download completed', 'Info', wx.OK) dial.ShowModal() def ShowMessage2(self, event): dial = wx.MessageDialog(None, 'Error loading file', 'Error', wx.OK | wx.ICON_ERROR) dial.ShowModal() def ShowMessage3(self, event): dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) dial.ShowModal() def ShowMessage4(self, event): dial = wx.MessageDialog(None, 'Unallowed operation', 'Exclamation', wx.OK | wx.ICON_EXCLAMATION) dial.ShowModal() def main(): ex = wx.App() Example(None) ex.MainLoop() if __name__ == '__main__': main()
在上面的例子中,我们创建了 4 个按钮并将之放置到一个 grid sizer 中。这些按钮将展示 4 个不同的对话框窗口,这些窗口在创建时使用了不同的样式标记。
def ShowMessage2(self, event): dial = wx.MessageDialog(None, 'Error loading file', 'Error', wx.OK | wx.ICON_ERROR) dial.ShowModal()
创建消息对话框比较简单。通过将 parent 参数设置为 None,我们将对话框设置为顶层窗口。接着的两个字符串参数为消息内容和对话框的标题。我们展示了一个 OK 按钮和一个 error 图标。调用 ShowModal() 函数,可以将对话框显示在屏幕上。
图:信息对话框
About 对话框
几乎每个应用都会有一个典型的 about 对话框,即关于对话框,经常放置在 帮助 菜单中。这个对话框的目的在于给用户提供应用的基本信息和当前版本。在过去,这些对话框相当的简明。近些年,大多数这样的对话框会提供额外的作者信息、应用的许可信息、公司或者应用的 logo,有的甚至会展示动画。从 版本 2.8.x 系列开始,wxPython 也有了专门的 About 对话框。
为了创建一个 About 对话框,我们需要新建两个对象:一个是 wx.AboutDialogInfo,另一个是 wx.AboutBox。
wxPython 可以展示两种 About 框,取决于我们使用哪个平台以及调用哪个方法,可以是原生的对话框也可以是 wxPython 类的对话框。Windows 原生对话框无法展示自定义的图标、许可文字以及URL链接。如果我们忽略这三个参数, wxPython 将展示一个原生的对话框,否则它将展示一个 wxPython 对话框。如果想尽可能的保持原生的话,建议在一个单独的菜单项提供许可信息。GTK+ 可以显示所有这些信息。
#!/usr/bin/python # -*- coding: utf-8 -*- ''' Translated By Achen @2017/9/22 === ZetCode wxPython tutorial In this example, we create an about dialog box. author: Jan Bodnar website: www.zetcode.com last modified: October 2011 ''' import wx class Example(wx.Frame): def __init__(self, *args, **kwargs): super(Example, self).__init__(*args, **kwargs) self.InitUI() def InitUI(self): menubar = wx.MenuBar() help = wx.Menu() help.Append(100, '&About') self.Bind(wx.EVT_MENU, self.OnAboutBox, id=100) menubar.Append(help, '&Help') self.SetMenuBar(menubar) self.SetSize((300, 200)) self.SetTitle('About dialog box') self.Centre() self.Show(True) def OnAboutBox(self, e): description = """File Hunter is an advanced file manager for the Unix operating system. Features include powerful built-in editor, advanced search capabilities, powerful batch renaming, file comparison, extensive archive handling and more. """ licence = """File Hunter is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. File Hunter is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with File Hunter; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA""" info = wx.AboutDialogInfo() info.SetIcon(wx.Icon('hunter.png', wx.BITMAP_TYPE_PNG)) info.SetName('File Hunter') info.SetVersion('1.0') info.SetDescription(description) info.SetCopyright('(C) 2007 - 2014 Jan Bodnar') info.SetWebSite('http://www.zetcode.com') info.SetLicence(licence) info.AddDeveloper('Jan Bodnar') info.AddDocWriter('Jan Bodnar') info.AddArtist('The Tango crew') info.AddTranslator('Jan Bodnar') wx.AboutBox(info) def main(): ex = wx.App() Example(None) ex.MainLoop() if __name__ == '__main__': main()
这个例子有一个 about 菜单项,选择该项以后,about 框会显示。
description = """File Hunter is an advanced file manager for the Unix operating system. Features include powerful built-in editor, advanced search capabilities, powerful batch renaming, file comparison, extensive archive handling and more. """
把太多文字放入到应用代码中并不是最好的办法。我们为了不让例子太复杂,把文字都放入到代码中了。在现实的程序中,文本应该单独放置在一个文件中。这样才能更好的去维护应用,比如要翻译应用的时候就比较方便。
info = wx.AboutDialogInfo()
首先要做的事情就是新建一个 wx.AboutDialogInfo 对象,构造函数的参数为空。
info.SetIcon(wx.Icon('hunter.png', wx.BITMAP_TYPE_PNG)) info.SetName('File Hunter') info.SetVersion('1.0') info.SetDescription(description) info.SetCopyright('(C) 2007 - 2014 Jan Bodnar') info.SetWebSite('http://www.zetcode.com') info.SetLicence(licence) info.AddDeveloper('Jan Bodnar') info.AddDocWriter('Jan Bodnar') info.AddArtist('The Tango crew') info.AddTranslator('Jan Bodnar')
接着是调用对 wx.AboutDialogInfo 调用所有的需要的方法来设置相关属性。
wx.AboutBox(info)
在最后,我们新建了 wx.AboutBox 部件,唯一的参数就是刚才设置好的 wx.AboutDialogInfo 对象。
当然,如果我们想有有动画或者其他好看的特性,必须自己手动扩展 dialog 类。
图:About 对话框
自定义对话框
在下面的例子中我们创建了一个自定义对话框。图片处理应用可以选择一个图片的颜色深度,我们为此新建合适的对话框。
#!/usr/bin/python # -*- coding: utf-8 -*- ''' ZetCode wxPython tutorial In this code example, we create a custom dialog. author: Jan Bodnar website: www.zetcode.com last modified: July 2012 ''' import wx class ChangeDepthDialog(wx.Dialog): def __init__(self, *args, **kw): super(ChangeDepthDialog, self).__init__(*args, **kw) self.InitUI() self.SetSize((250, 200)) self.SetTitle("Change Color Depth") def InitUI(self): pnl = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) sb = wx.StaticBox(pnl, label='Colors') sbs = wx.StaticBoxSizer(sb, orient=wx.VERTICAL) sbs.Add(wx.RadioButton(pnl, label='256 Colors', style=wx.RB_GROUP)) sbs.Add(wx.RadioButton(pnl, label='16 Colors')) sbs.Add(wx.RadioButton(pnl, label='2 Colors')) hbox1 = wx.BoxSizer(wx.HORIZONTAL) hbox1.Add(wx.RadioButton(pnl, label='Custom')) hbox1.Add(wx.TextCtrl(pnl), flag=wx.LEFT, border=5) sbs.Add(hbox1) pnl.SetSizer(sbs) hbox2 = wx.BoxSizer(wx.HORIZONTAL) okButton = wx.Button(self, label='Ok') closeButton = wx.Button(self, label='Close') hbox2.Add(okButton) hbox2.Add(closeButton, flag=wx.LEFT, border=5) vbox.Add(pnl, proportion=1, flag=wx.ALL|wx.EXPAND, border=5) vbox.Add(hbox2, flag=wx.ALIGN_CENTER|wx.TOP|wx.BOTTOM, border=10) self.SetSizer(vbox) okButton.Bind(wx.EVT_BUTTON, self.OnClose) closeButton.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, e): self.Destroy() class Example(wx.Frame): def __init__(self, *args, **kw): super(Example, self).__init__(*args, **kw) self.InitUI() def InitUI(self): ID_DEPTH = wx.NewId() tb = self.CreateToolBar() tb.AddLabelTool(id=ID_DEPTH, label='', bitmap=wx.Bitmap('color.png')) tb.Realize() self.Bind(wx.EVT_TOOL, self.OnChangeDepth, id=ID_DEPTH) self.SetSize((300, 200)) self.SetTitle('Custom dialog') self.Centre() self.Show(True) def OnChangeDepth(self, e): chgdep = ChangeDepthDialog(None, title='Change Color Depth') chgdep.ShowModal() chgdep.Destroy() def main(): ex = wx.App() Example(None) ex.MainLoop() if __name__ == '__main__': main()
在上面的例子中,我们新建了一个自定义对话框。
class ChangeDepthDialog(wx.Dialog): def __init__(self, *args, **kw): super(ChangeDepthDialog, self).__init__(*args, **kw)
我们新建了一个 ChangeDepthDialog 对话框,它是继承于 wx.Dialog 部件。
chgdep = ChangeDepthDialog(None, title='Change Color Depth') chgdep.ShowModal() chgdep.Destroy()
上面几行代码中,我们实例化了一个 ChangeDepthDialog 类,然后调用了 ShowModal() 函数。不要忘记销毁。下面的对话框显示后,应用的其他顶级窗口无法在操作,直到我们关闭对话框。注意到,对话框的标题栏明显不同于普通窗口。
图:自定义对话框
在本节,我们主要讲解 wxPython 对话框 相关知识。