Python学习(十三)------- GUI程序设计

来源:互联网 发布:c语言进程的创建 编辑:程序博客网 时间:2024/05/01 17:15

看书有些看乏了,找了一些GUI程序设计方面的内容来解解闷儿。

Python的GUI程序设计基于强大的库,而且不止一个库可以支持,而不同的库虽然名字或者实现方式不同,但是用法基本相同,学会一个其他的就不成问题了,Windows的用户界面也就那点东西嘛。

首先从网上下了一个做图形界面的库wxPython,从其官网http://www.wxpython.org/可以下载到。因为这个库最高支持到Python2.7的版本,我又把已经装好的最新版的Python3.3卸载掉,下了一个2.75版本的装上,现在似乎好多教程都是基于2.6或者2.7的,而最新的3.3又跟原来的不兼容,真是够痛苦的(强迫症患者。。。)。下载下来的库是一个exe的安装包,直接按默认来安装就可以使用了。

利用这个库,只需要5行代码就可以生成一个窗口出来,就像《Window程序设计》里面的那第一个Windows窗口界面应用程序一样的,还真TMD方便啊:

import wx

app = wx.App()

win = wx.Frame(None)

win.Show()

app.MainLoop()

要用外来的库,当然得先导入这个库,名字就是wx。Python的GUI分成了两部分,一个是app部分,代表程序的实例,一个是frame,代表的是程序的窗口,这和MFC里面的App还有Wnd是一样的嘛。前面那两行用来“new”出新的程序实例和窗口实例,再后面调用显示窗口,然后最后进行主循环,也就是Windows程序的主循环。这个相对于用C++来产生出一个窗口简直太简单了。

另外,还可以在窗口里面加上各种控件,像按钮啊、文本框之类的,其实也和窗口产生的过程一样,本来按钮、文件框什么的也就是一个窗口嘛。

btn = wx.Button(win)

这样就在win窗口中产生出一个按钮出来,其中的参数指示其父窗口,这个可不能给None,否则会导致异常。在参数列表中还可以指定其显示文字,位置,大小等,分别用label、pos、size这几个命名参数来指示。另外Frame可以用Title、size来指示整个窗口的标题和大小等信息,这些参数都可以去官网上看它的参考手册(E文不行啊,看不懂哭)。

其他的控件和按钮控件一样,也可以通过同样的方式来产生和控制。

用控件的属性来对控件的大小位置等进行控制之后,控件的大小和位置就固定了,当对外窗口对行拖拽放大缩小时,控件也不会发生化,要想让控件随着窗口进行变化,就需要用于布局管理器BoxSizer,这个东西有点像HTML里面那个<div>标签的用法。直接上代码,说多了烦。。。

import wx

app = wx.App()

win = wx.Frame(None)

bkg = wx.Panel(win)


btn1 = wx.Button(bkg, label="Save")
btn2 = wx.Button(bkg, label="Open")
filename = wx.TextCtrl(bkg)
contents = wx.TextCtrl(bkg, style=wx.VSCROLL|wx.MULTIPLE)


hbox = wx.BoxSizer()
hbox.Add(filename, proportion=1, flag=wx.EXPAND|wx.LEFT, border=5)
hbox.Add(btn2, proportion=0, flag=wx.LEFT, border=5)
hbox.Add(btn1, proportion=0, flag=wx.LEFT, border=5)


vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox, proportion=0, flag=wx.EXPAND)
vbox.Add(contents, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.TOP, border=5)


bkg.SetSizer(vbox)


win.Show()
app.MainLoop()

其中近个Panel是什么东西还没搞明白,以后再说,暂且只看名字,把它当成是窗口背景。窗口布局用wx.BoxSizer()来定义,然后通过Add方法来把控件按顺序加入到里面,默认是左右方向的而已,可以通过参数wx.VERTICAL来改成上下方向的布局。通过Add方法的proportion属性可以设置在本次布局中所占的比例,为0的话就表示保持最小的大小。另外还可以将flag属性设置为wx.EXPAND来使控件大小随父窗口变化,flag为wx.LEFT等可以设置控件左边界空出的像素数,这个大小是通过后面的border属性来控制的。

左右布局好了之后,这个BoxSizer又可以作为一个整体参与到另外一个布局管理器中。真的很像<div>哦可怜,还有那个表格的标签,忘了是什么了。

下面最重要的就是对事件的处理了,只把按钮等控件摆在上面现在除了能看能点其他什么作用都没有,现在就要对它进行事件绑定,这个感觉有点像VB里面的东西了呢尴尬,即使这样,Python也不会跟着掉价,毕竟GUI不是用Python的主要原因,而且这样本来就很方便的嘛。还是直接上代码:

import wx


app = wx.App()
win = wx.Frame(None, title="NotePad", size=(500, 400))


def fileopen(evt):
    filepath = filename.GetValue()
    fopen = open(filepath)
    contents.SetValue(fopen.read())
    fopen.close()


def filesave(evt):
    filepath = filename.GetValue()
    fopen = open(filepath, "w")
    fopen.write(contents.GetValue())
    fopen.close()


bkg = wx.Panel(win)


btn1 = wx.Button(bkg, label="Save")
btn2 = wx.Button(bkg, label="Open")
filename = wx.TextCtrl(bkg)
contents = wx.TextCtrl(bkg, style=wx.VSCROLL|wx.MULTIPLE)


btn2.Bind(wx.EVT_BUTTON, fileopen)
btn1.Bind(wx.EVT_BUTTON, filesave)


hbox = wx.BoxSizer()
hbox.Add(filename, proportion=2, flag=wx.EXPAND|wx.LEFT, border=5)
hbox.Add(btn2, proportion=1, flag=wx.LEFT, border=5)
hbox.Add(btn1, proportion=1, flag=wx.LEFT, border=5)


vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox, proportion=0, flag=wx.EXPAND)
vbox.Add(contents, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.TOP, border=5)


bkg.SetSizer(vbox)

看一遍别人讲解的视频就把这些代码能自己打出来我也不容易了吐舌头。起变化的就两个地方,一个是定义函数那里,定义了两个函数,用来分别处理两个按钮的单击事件,另外一个就是把按钮和事件和刚刚定义的函数进行了绑定,只用一个Bind方法就可以了。至于定义函数里面文本控件的GetValue和SetValue方法等的都是些小事,不关注了。这样的话基本上一个完整的GUI程序就展现出来了,其实还是很简单的,至少比用C语言做起来要少好多的代码。