转自:http://thisis.yorven.site/blog/index.php/2017/09/16/wxpython-jiaocheng-er-kaishibianxie/

简单例子

从简单例子开始,我们的脚本将新建一些简单窗口。没有太多的东西,我们将一行一行的分析下面这段脚本:

1
2
3
4
5
6
7
#!/usr/bin/python
# simple.py
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'simple.py')
frame.Show()
app.MainLoop()

这是我们的第一个wxPython例子,首先来看看前两行。

1
2
#!/usr/bin/python
# simple.py

第一行首先是一个she-bang符号,即#!,后面紧跟着Python解释器的路径。第二行是一句注释,表明了该脚本的名字。

1
import  wx

这一行导入了wxPython的基本模块,即上一节提到的core、controls、gdi、misc和windows模块。wx是一个命名空间,所有来自于基本模块的函数和对象都以wx打头。

1
app = wx.App()

这一行新建了一个应用对象(application object),所有的wxPython程序必须有一个应用对象。

1
2
frame = wx.Frame(None, -1, 'simple.py')
frame.Show()

这里我们新建了wx.Frame对象。构造函数的各参数意义:父类=None,id=-1,title=’simple.py’。wx.Frame对象是一种重要的容器widget,随后我们将详细分析它。wx.Frame是其他widgets的父类,它自身并没有父类,所以在widgets层级中属于一种顶级widget。id可设置为-1,或wxPython的一些常量,后文会提到。title即窗口的标题。在新建wx.Frame widget之后,我们必须调用Show()函数才能使其显示在屏幕上。

1
app.MainLoop()

最后一行使当前应用进入主循环。主循环是一个无限循环,它捕获、分发应用生命周期中的所有事件。

以上是一个非常简单的例子,但我们得到的窗口仍然有很多功能。比如改变大小、最大化、最小化等。这些功能需要很多的代码,但这些都默认由wxPython提供,我们也无需重新造轮子。

简单例子的结果

wx.Frame

wx.Frame是wxPython中最重要的widgets,它是一种容器widgets,可以容纳其他widgets。事实上,wx.Frame可以容纳任何除了frame和dialog的window部件。wx.Frame包含一个标题栏、边框和一个中间的容器区域,其中标题栏和边框是可选的,通过设置不同的标记可以去掉。

wx.Frame的构造函数如下:

1
2
wx.Frame(wx.Window parent, int id=-1, string title='', wx.Point pos = wx.DefaultPosition,
wx.Size size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, string name = "frame")

构造函数有7个参数。第一个参数没有默认值,其他六个都有。有四个参数为可选参数,前三个为强制的。

wx.DEFAULT_FRAME_STYLE包含一系列的默认Flags,这些Flag可以设置窗口的样式,比如wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN。竖线将不同的Flag联合起来。下面是一个简短的例子:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# nominimizebox.py
import wx
app = wx.App()
window = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER
| wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
window.Show(True)

app.MainLoop()

我们想得到一个没有最小化按钮的窗口,所以我们在style参数的设置中没有加wx.MINIMIZE_BOX这个参数。

没有最小化按钮框的窗口

大小和位置

我们可以通过两种方式定义应用的大小。在widget的构造函数中,有一个参数size可以设定。或者我们可以调用SetSize()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python
# -*- coding: utf-8 -*-
# size.py
import wx
class Example(wx.Frame):

def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title,
size=(250, 200))
self.Show()

if __name__ == '__main__':
app = wx.App()
Example(None, title='Size')
app.MainLoop()

在上面这个例子中,应用的大小为250x200px。我们是在构造函数中定义这一参数的。

相似地,我们也可以对我们的应用再屏幕上进行定位。默认情况下,窗口被放置在屏幕的左上角,但不同操作系统或者窗口管理系统可能存在不同。程序员可在程序代码中设定窗口位置。我们已经在wx.Frame的构造函数中看到了pos参数,通过它我们可以指定窗口的位置。

同时,有几种方法可以设定窗口位置,如下所示。

Method Description
Move(wx.Point point) 将窗口移动到指定位置
MoveXY(int x, int y) 将窗口移动到指定位置
SetPosition(wx.Point point) 设定窗口位置
SetDimensions(x, y, width, height, sizeFlags) 设定窗口位置和大小

下面是一个具体的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
# -*- coding: utf-8 -*-
# move.py
import wx

class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title,
size=(300, 200))

self.Move((800, 250))
self.Show()

if __name__ == '__main__':

app = wx.App()
Example(None, title='Move')
app.MainLoop()

如果我们想最大化我们的程序,需要将窗口放置在(0,0)的坐标位置,然后让窗口占满整个屏幕。使用Maximize()函数可以将wx.Frame最大化。

在屏幕中央

如果我们想将应用再屏幕中居中,wxPython已经有很方便的方法,直接调用Centre()方法就可以做到,且无需手动计算屏幕的宽度和高度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python
# -*- coding: utf-8 -*-
# center.py
import wx
class Example(wx.Frame):

def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title,
size=(300, 200))

self.Centre()
self.Show()

if __name__ == '__main__':

app = wx.App()
Example(None, title='Center')
app.MainLoop()

在这个例子中,我们将一个小窗口居中在屏幕当中。

1
self.Centre()

上面就是居中窗口的方法调用。

在本节中,我们写了wxPython的简单代码样例,让读者能够快速的上手wxPython。