Ross Wan's World!

Python, Ajax, PHP and Linux.

wxPython:对话框

Posted by Ross Wan 于 2008/04/22

       对话框是 GUI 应用程序中不可缺少的一部分,它是人与程序交互的一个窗口,方便用户输入、修改数据,或者更改程序的设置。

一个简单的消息对话框(Message box)

       简单消息对话框可以向用户反映简短的信息。

#!/usr/bin/python
# message.py

import wx

class MessageDialog(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        wx.FutureCall(5000, self.ShowMessage)

        self.Centre()
        self.Show(True)

    def ShowMessage(self):
        wx.MessageBox(‘Download completed’, ‘Info’)

app = wx.App()
MessageDialog(None, -1, ‘MessageDialog’)
app.MainLoop()

 wx.FutureCall(5000, self.ShowMessage)

       wx.FutureCall 是一个延迟调用函数,例子中,ShowMessage() 将会在5秒后被调用。函数的第一个参数是一个时间值,以毫秒为单位,表示在某个时间之后,给定的方法将会被调用。第二个参数是一个将被调用的方法。

 def ShowMessage(self):
     wx.MessageBox(‘Download completed’, ‘Info’)

       wx.MessageBox 方法显示一个对话框,我们给它提供了两个参数,一个是消息文本,一个是标题。

预设对话框(Predefined dialogs)

       wxPython 本身提供了几个预设对话框,可以完成一些通用的任务,例如显示文本、接收输入、打开和保存文件等等。

消息对话框(Message dialogs)

       跟上面例子的简单消息对话框(Message box)相似,消息对话框也是用于向用户传递信息的,但更为灵活。我们可以自定义消息对话框,改变它的图标和按钮等等。

 wx.MessageDialog(wx.Window parent, string message, string caption=wx.MessageBoxCaptionStr, long style=wx.OK | wx.CANCEL | wx.CENTRE, wx.Point pos=(-1, -1))

标志(flag)            含义(meaning)
wx.OK                        显示 OK 按钮    
wx.CANCEL                显示 Cancel 按钮
wx.YES_NO                显示 Yes 和 No 按钮
wx.YES_DEFAULT       默认为 Yes 按钮
wx.NO_DEFAULT        默认为 No 按钮
wx.ICON_EXCLAMATION    显示一个警告图标
wx.ICON_ERROR          显示一个错误图标
wx.ICON_HAND            跟 wx.ICON_ERROR 一样
wx.ICON_INFORMATION    显示一个信息图标
wx.ICON_QUESTION       显示一个问号图标

#!/usr/bin/python
# messages.py

import wx

class Messages(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(250, 150))

        panel = wx.Panel(self, -1)

        hbox = wx.BoxSizer()
        sizer = wx.GridSizer(2, 2, 2, 2)

        btn1 = wx.Button(panel, -1, ‘Info’)
        btn2 = wx.Button(panel, -1, ‘Error’)
        btn3 = wx.Button(panel, -1, ‘Question’)
        btn4 = wx.Button(panel, -1, ‘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.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()

app = wx.App()
Messages(None, -1, ‘Messages’)
app.MainLoop()

       在上面的例子中,通过使用不同的标志(flags),显示4种类型的消息对话框。

 dial = wx.MessageDialog(None, ‘Error loading file’, ‘Error’, wx.OK | wx.ICON_ERROR)
 dial.ShowModal()

       可见,创建一个消息对话框是很简单的事情。我们 parent 参数为 None,使得对话框窗口成为一个顶层窗口。两个字符串分别是消息文本和对话框的标题。指定 wx.OK 和 wx.ICON_ERROR 标志,使对话框显示 OK 按钮和错误图标。最后,调用 ShowModal() 方法显示对话框。




关于对话框(About dialog box)

       几乎每一个应用程序都有一个关于对话框,它通常位于帮助菜单。在关于对话框里,可以看到应用程序的一些相关信息,如程序名和版本等等。在过去,关于对话框 显示的信息是很简单的,但到了现在,关于对话框不但提供了传统的信息,还提供了许多附加的信息,如作者,程序和文件的贡献者,程序的许可协议,公司的商标 和程序的徽标,甚至可以显示一个动画。从 2.8.x 版本开始,wxPython 提供可定制的关于对话框。

       关于对话框是位于 wxPython 的 杂项(Misc)模块。要创建关于对话框,必须创建两个对象:wx.AboutDialogInfo 和wx.AboutBox。

 wx.AboutDialogInfo()

       下面这些是 wx.AboutDialogInfo 对象可以使用的方法:

方法(Method)                 描述(Description)
SetName(string name)            设置程序名
SetVersion(string version)        设置程序版本号
SetDescription(string desc)      设置程序的描述
SetCopyright(string copyright)  设置程序的版权
SetLicence(string licence)         设置程序的许可协议
SetIcon(wx.Icon icon)                 设置程序图标
SetWebSite(string URL)              设置网址
AddDeveloper(string developer)  添加开发者名到程序开发者列表
AddDocWriter(string docwirter)    添加文档编辑者名到文档编辑者列表
AddArtist(string artist)                 添加一个 artist 到 artist 列表
AddTranslator(string developer)   添加一个名字到程序翻译者列表

       下面是 wx.AboutBox 的构造函数,它需要一个 wx.AboutDialogInfo 对象作参数:

 wx.AboutBox(wx.AboutDialogInfo info)

       wxPython 可以显示两种类型的关于对话框(这取决于我们的平台和调用的方法),一种是本地对话框,另一种是 wxPython 的常规对话框。Windows 本地的关于对话框不能显示自定义的图标、协议文本和网址,如果我们在对话框的设置中没有使用到这些东西,本地关于对话框将会显示,否则会显示 wxPython 的常规关于对话框。在 GTK+ 环境下,本地关于对话框可以正常显示自定义图标、协议等。

#!/usr/bin/python
# aboutbox.py

import wx

ID_ABOUT = 1

class AboutDialogBox(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(260, 200))

        menubar = wx.MenuBar()
        help = wx.Menu()
        help.Append(ID_ABOUT, ‘&About’)
        self.Bind(wx.EVT_MENU, self.OnAboutBox, id=ID_ABOUT)
        menubar.Append(help, ‘&Help’)
        self.SetMenuBar(menubar)

        self.Centre()
        self.Show(True)

    def OnAboutBox(self, event):
        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(‘icons/hunter.png’, wx.BITMAP_TYPE_PNG))
        info.SetName(‘File Hunter’)
        info.SetVersion(‘1.0’)
        info.SetDescription(description)
        info.SetCopyright(‘(C) 2007 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)

app = wx.App()
AboutDialogBox(None, -1, ‘About dialog box’)
app.MainLoop()

 info = wx.AboutDialogInfo()

       首先是创建一个 wx.AboutDialogInfo 对象。

 info.SetIcon(wx.Icon(‘icons/hunter.png’, wx.BITMAP_TYPE_PNG))
 info.SetName(‘File Hunter’)
 info.SetVersion(‘1.0’)
 info.SetDescription(description)
 info.SetCopyright(‘(C) 2007 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 对象。

自定义对话框(Custom dialog)

       在下面的例子中,我们将创建一个自定义对话框,实现改变图片的颜色深度。

#!/usr/bin/python
# colordepth.py

import wx

ID_DEPTH = 1

class ChangeDepth(wx.Dialog):
    def __init__(self, parent, id, title):
        wx.Dialog.__init__(self, parent, id, title, size=(250, 210))

        panel = wx.Panel(self, -1)
        vbox = wx.BoxSizer(wx.VERTICAL)

        wx.StaticBox(panel, -1, ‘Colors’, (5, 5), (240, 150))
        wx.RadioButton(panel, -1, ‘256 Colors’, (15, 30), style=wx.RB_GROUP)
        wx.RadioButton(panel, -1, ’16 Colors’, (15, 55))
        wx.RadioButton(panel, -1, ‘2 Colors’, (15, 80))
        wx.RadioButton(panel, -1, ‘Custom’, (15, 105))
        wx.TextCtrl(panel, -1, ”, (95, 105))

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        okButton = wx.Button(self, -1, ‘Ok’, size=(70, 30))
        closeButton = wx.Button(self, -1, ‘Close’, size=(70, 30))
        hbox.Add(okButton, 1)
        hbox.Add(closeButton, 1, wx.LEFT, 5)

        vbox.Add(panel)
        vbox.Add(hbox, 1, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 10)

        self.SetSizer(vbox)
 

class ColorDepth(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(350, 220))

        toolbar = self.CreateToolBar()
        toolbar.AddLabelTool(ID_DEPTH, ”, wx.Bitmap(‘icons/color.png’))

        self.Bind(wx.EVT_TOOL, self.OnChangeDepth, id=ID_DEPTH)

        self.Centre()
        self.Show(True)

    def OnChangeDepth(self, event):
        chgdep = ChangeDepth(None, -1, ‘Change Color Depth’)
        chgdep.ShowModal()
        chgdep.Destroy()

app = wx.App()
ColorDepth(None, -1, ”)
app.MainLoop()

 class ChangeDepth(wx.Dialog):
     def __init__(self, parent, id, title):
         wx.Dialog.__init__(self, parent, id, title, size=(250, 210))

       上面是一个自定义的对话框 ChangeDepth,继承了 wx.Dialog。

 chgdep = ChangeDepth(None, -1, ‘Change Color Depth’)
 chgdep.ShowModal()
 chgdep.Destroy()

       创建一个 ChangeDepth 对象,调用 ShowModal() 方法来显示自定义对话框。

Advertisements

一条回应 to “wxPython:对话框”

  1. Ross Wan said

    翻译自:The wxPython tutorial

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

 
%d 博主赞过: