将来的你
一定会感谢现在拼命努力的自己

wxPython 教程 (六): 对话框

对话框即 Dialog 是多数 GUI 应用不可缺少的部分。“对话”是指两个或更多人之间的交谈。在电脑应用中,对话框是指一个可以和应用交流的窗口,可以用来输入数据、修改数据、修改应用设置等。因此,对话框是用户和电脑程序交流的重要手段。本节我们主要对 wxPython 对话框 进行讲解。

一个简单的 wxPython 消息框

消息框可以给用户提供简单的信息,一个较好的例子是 CD 的刻录应用,当 CD 刻录完毕后会弹出一个消息框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/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
'''
 
importwx
 
classExample(wx.Frame):
     
    def__init__(self,*args,**kwargs):
        super(Example,self).__init__(*args,**kwargs)
             
        self.InitUI()
         
    defInitUI(self):   
 
        wx.FutureCall(5000,self.ShowMessage)
 
        self.SetSize((300,200))
        self.SetTitle('Message box')
        self.Centre()
        self.Show(True)
 
    defShowMessage(self):
        wx.MessageBox('Download completed','Info',
            wx.OK | wx.ICON_INFORMATION)
 
 
defmain():
     
    ex=wx.App()
    Example(None)
    ex.MainLoop()   
 
 
if__name__=='__main__':
    main()   

这个例子在5秒后会展示一个消息框。

1
wx.FutureCall(5000,self.ShowMessage)

wx.FutureCall 在5秒后会调用某个方法。第一个参数是时间值,单位是毫秒;第二个参数是被调用的方法。

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

wx.MessageBox 展示了一个小的对话框,其中三个参数,第一个为消息内容,第二个是标题,第三个是一些标记,用来展示不同的按钮和图标。在这个例子中,我们展示了一个 OK 按键和一个 Information 图标。

tutorial wxpython-jiaocheng

图:一个消息框

预定义 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 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/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
'''
 
importwx
 
classExample(wx.Frame):
     
    def__init__(self,*args,**kwargs):
        super(Example,self).__init__(*args,**kwargs)
             
        self.InitUI()
         
    defInitUI(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)
 
    defShowMessage1(self, event):
        dial=wx.MessageDialog(None,'Download completed','Info', wx.OK)
        dial.ShowModal()
 
    defShowMessage2(self, event):
        dial=wx.MessageDialog(None,'Error loading file','Error',
            wx.OK | wx.ICON_ERROR)
        dial.ShowModal()
 
    defShowMessage3(self, event):
        dial=wx.MessageDialog(None,'Are you sure to quit?','Question',
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        dial.ShowModal()
 
    defShowMessage4(self, event):
        dial=wx.MessageDialog(None,'Unallowed operation','Exclamation',
            wx.OK | wx.ICON_EXCLAMATION)
        dial.ShowModal()
 
defmain():
     
    ex=wx.App()
    Example(None)
    ex.MainLoop()   
 
 
if__name__=='__main__':
    main()

在上面的例子中,我们创建了 4 个按钮并将之放置到一个 grid sizer 中。这些按钮将展示 4 个不同的对话框窗口,这些窗口在创建时使用了不同的样式标记。

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

创建消息对话框比较简单。通过将 parent 参数设置为 None,我们将对话框设置为顶层窗口。接着的两个字符串参数为消息内容和对话框的标题。我们展示了一个 OK 按钮和一个 error 图标。调用 ShowModal() 函数,可以将对话框显示在屏幕上。

tutorial wxpython-jiaocheng

图:信息对话框

About 对话框

几乎每个应用都会有一个典型的 about 对话框,即关于对话框,经常放置在 帮助 菜单中。这个对话框的目的在于给用户提供应用的基本信息和当前版本。在过去,这些对话框相当的简明。近些年,大多数这样的对话框会提供额外的作者信息、应用的许可信息、公司或者应用的 logo,有的甚至会展示动画。从 版本 2.8.x 系列开始,wxPython 也有了专门的 About 对话框。

为了创建一个 About 对话框,我们需要新建两个对象:一个是 wx.AboutDialogInfo,另一个是 wx.AboutBox。

wxPython 可以展示两种 About 框,取决于我们使用哪个平台以及调用哪个方法,可以是原生的对话框也可以是 wxPython 类的对话框。Windows 原生对话框无法展示自定义的图标、许可文字以及URL链接。如果我们忽略这三个参数, wxPython 将展示一个原生的对话框,否则它将展示一个 wxPython 对话框。如果想尽可能的保持原生的话,建议在一个单独的菜单项提供许可信息。GTK+ 可以显示所有这些信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/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
'''
 
importwx
 
 
classExample(wx.Frame):
     
    def__init__(self,*args,**kwargs):
        super(Example,self).__init__(*args,**kwargs)
             
        self.InitUI()
         
    defInitUI(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)
 
    defOnAboutBox(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)
 
 
defmain():
     
    ex=wx.App()
    Example(None)
    ex.MainLoop()   
 
 
if__name__=='__main__':
    main()

这个例子有一个 about 菜单项,选择该项以后,about 框会显示。

1
2
3
4
5
        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.
"""

把太多文字放入到应用代码中并不是最好的办法。我们为了不让例子太复杂,把文字都放入到代码中了。在现实的程序中,文本应该单独放置在一个文件中。这样才能更好的去维护应用,比如要翻译应用的时候就比较方便。

1
info=wx.AboutDialogInfo()

首先要做的事情就是新建一个 wx.AboutDialogInfo 对象,构造函数的参数为空。

1
2
3
4
5
6
7
8
9
10
11
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 调用所有的需要的方法来设置相关属性。

1
wx.AboutBox(info)

在最后,我们新建了 wx.AboutBox 部件,唯一的参数就是刚才设置好的 wx.AboutDialogInfo 对象。

当然,如果我们想有有动画或者其他好看的特性,必须自己手动扩展 dialog 类。

tutorial wxpython-jiaocheng

图:About 对话框

自定义对话框

在下面的例子中我们创建了一个自定义对话框。图片处理应用可以选择一个图片的颜色深度,我们为此新建合适的对话框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/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
'''
 
importwx
 
classChangeDepthDialog(wx.Dialog):
     
    def__init__(self,*args,**kw):
        super(ChangeDepthDialog,self).__init__(*args,**kw)
             
        self.InitUI()
        self.SetSize((250,200))
        self.SetTitle("Change Color Depth")
         
         
    defInitUI(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)
         
         
    defOnClose(self, e):
         
        self.Destroy()
         
         
classExample(wx.Frame):
     
    def__init__(self,*args,**kw):
        super(Example,self).__init__(*args,**kw)
             
        self.InitUI()
         
         
    defInitUI(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)
         
         
    defOnChangeDepth(self, e):
         
        chgdep=ChangeDepthDialog(None,
            title='Change Color Depth')
        chgdep.ShowModal()
        chgdep.Destroy()       
 
 
defmain():
     
    ex=wx.App()
    Example(None)
    ex.MainLoop()   
 
 
if__name__=='__main__':
    main()

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

1
2
3
4
classChangeDepthDialog(wx.Dialog):
     
    def__init__(self,*args,**kw):
        super(ChangeDepthDialog,self).__init__(*args,**kw)

我们新建了一个 ChangeDepthDialog 对话框,它是继承于 wx.Dialog 部件。

1
2
3
4
chgdep=ChangeDepthDialog(None,
    title='Change Color Depth')
chgdep.ShowModal()
chgdep.Destroy() 

上面几行代码中,我们实例化了一个 ChangeDepthDialog 类,然后调用了 ShowModal() 函数。不要忘记销毁。下面的对话框显示后,应用的其他顶级窗口无法在操作,直到我们关闭对话框。注意到,对话框的标题栏明显不同于普通窗口。
tutorial wxpython-jiaocheng

赞(0) 打赏
声明:本站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,若涉及侵权请及时告知,将会在第一时间删除,联系邮箱:contact@3yyy.top。文章观点不代表本站立场。本站原创内容未经允许不得转载:三叶运维 » wxPython 教程 (六): 对话框
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏