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语言做起来要少好多的代码。
- Python学习(十三)------- GUI程序设计
- Java学习12 GUI程序设计(AWT)
- Java学习13 GUI程序设计(Swing)
- python 学习笔记(十三)
- Python学习笔记(十三)
- python学习(二十三)
- Python进阶 - GUI程序设计(tkinter)
- JAVA基础学习(二十三)--GUI基础
- QT之GUI学习笔记(十三)----QInputDialog
- python的学习(十三)---- ftplib模块
- python 系统学习笔记(十三)---lambda
- Python学习笔记(十三):模块基础
- python 系统学习笔记(十三)---lambda
- python 学习笔记(二十三)
- 学习Python(十三)
- Python学习杂记十三
- Python之学习笔记(GUI设计)
- Python Gui 学习 Tkinter
- win 7 下 PIL python Image模块 show函数不能正常显示图片
- orace的rownum
- Android
- MySQL索引的查看创建和删除
- POJ3260:The Fewest Coins(混合背包)
- Python学习(十三)------- GUI程序设计
- 【C++】fwrite与fread
- hrust OJ 1316 移动II
- 黑马程序员----【javaSE基础】IO--字节流
- hdu 4619(sap解二分匹配)
- hdu4300
- C#操作Informix数据库
- 又议android中的manifest清单文件
- 黑马程序员----【javaSE基础】IO--字符流