本节我们学习使用python3进行GUI(图形用户界面)编程,简单来说就是类似电脑端QQ。python有许多GUI工具组件,小编使用过Tkinter和wxPython,语法上基本大同小异,本节我们就使用wxPython来编程。下面我们创建一个窗口。
import wx
app = wx.App()
frame = wx.Frame(parent=None,title='gui',pos=(50,30),size=(500,300))
frame.Show()
app.MainLoop()
以上就是使用wxPython进行GUI编程的基本姿势了,我们就是在窗口上添加元素,然后对元素进行布局,元素可以绑定相应的事件。下面我们使用文本标签组件StaticText,文本输入组件TextCtrl,按钮Button来完成一个登录窗口。
panel = wx.Panel(frame)user = wx.StaticText(panel,label='账号',pos=(100,90))user_input = wx.TextCtrl(panel,pos=(150,90),size=(100,25))pswd = wx.StaticText(panel,label='密码',pos=(100,150))pswd_input = wx.TextCtrl(panel,pos=(150,150),size=(100,25))bt_submit = wx.Button(panel,label='确定',pos=(150,200))bt_reset = wx.Button(panel,label='取消',pos=(250,200))
可以看到每个元素都有自己的parent元素组件,我们把登录相关的元素组件都放到了画板panel里,元素放到对应的容器里便于我们整体布局。下面我们看下元素的事件绑定。
bt_submit.Bind(wx.EVT_BUTTON,self.bt_submit_click)def bt_submit_click(self,EVENT): if self.user_input.GetValue() == '' or self.pswd_input.GetValue() == '': wx.MessageBox('请输入用户名,密码')事件绑定就是指定想要触发的事件,例如点击按钮,用户键盘输入,鼠标双击等;然后指定事件函数,事件发生时所要执行的函数。上面我们创建的元素组件都需要指定位置pos和组件大小size非常不方便,wxPython为我们提供了非常方便的布局组件Sizer,多个Sizer还可以相互嵌套。下面我们使用布局组件对整体进行布局。
layout_u = wx.BoxSizer(wx.HORIZONTAL)layout_u.Add(self.user_label,proportion=0,flag=wx.ALL,border=10)layout_u.Add(self.user_input, proportion=1, flag=wx.ALL, border=10)layout_t = wx.BoxSizer(wx.VERTICAL)layout_t.Add(layout_u,proportion=0,flag=wx.EXPAND|wx.RIGHT,border=10)
使用Sizer可以很方便的进行横向,纵向,嵌套布局,元素还可以设定自适应窗体大小。有关wxPython的知识大家可以参考官网文档。
wxPython官网API
https://docs.wxpython.org/
本节就分享到这里,学会了GUI,我们就可以创建桌面应用程序了,比如我们使用的字典类工具,文件查找工具等,结合我们之前的网络编程,就可以创建自己的富客户端应用程序。下面是本节示例代码。
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,fid,title):
wx.Frame.__init__(self,parent,fid,title,size=(300,200))
panel = wx.Panel(self)
self.title = wx.StaticText(panel,label='用户登陆')
self.user_label = wx.StaticText(panel, label='账号')
self.user_input = wx.TextCtrl(panel,style=wx.TE_LEFT)
self.pswd_label = wx.StaticText(panel, label='密码')
self.pswd_input = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
self.bt_submit = wx.Button(panel, label='确定')
self.bt_reset = wx.Button(panel, label='取消')
self.bt_submit.Bind(wx.EVT_BUTTON,self.bt_submit_click)
layout_u = wx.BoxSizer(wx.HORIZONTAL)
layout_u.Add(self.user_label,proportion=0,flag=wx.ALL,border=10)
layout_u.Add(self.user_input, proportion=1, flag=wx.ALL, border=10)
layout_p = wx.BoxSizer(wx.HORIZONTAL)
layout_p.Add(self.pswd_label, proportion=0, flag=wx.ALL, border=10)
layout_p.Add(self.pswd_input, proportion=1, flag=wx.ALL, border=10)
layout_b = wx.BoxSizer(wx.HORIZONTAL)
layout_b.Add(self.bt_submit, proportion=0, flag=wx.ALIGN_LEFT, border=10)
layout_b.Add(self.bt_reset, proportion=0, flag=wx.ALIGN_CENTER, border=10)
layout_t = wx.BoxSizer(wx.VERTICAL)
layout_t.Add(self.title,proportion=0,flag=wx.ALIGN_CENTER|wx.TOP,border=20)
layout_t.Add(layout_u,proportion=0,flag=wx.EXPAND|wx.RIGHT,border=10)
layout_t.Add(layout_p,proportion=0,flag=wx.EXPAND|wx.RIGHT,border=10)
layout_t.Add(layout_b,proportion=0,flag=wx.ALIGN_CENTER,border=20)
panel.SetSizer(layout_t)
def bt_submit_click(self,EVENT):
if self.user_input.GetValue() == '' or self.pswd_input.GetValue() == '':
wx.MessageBox('请输入用户名,密码')
elif self.user_input.GetValue() == 'wxpython' and self.pswd_input.GetValue() == '123456':
wx.MessageBox('登陆成功')
else:
wx.MessageBox('用户名或密码不正确')
if __name__ == '__main__':
app = wx.App()
frame = MyFrame(None,0,'小麦布局')
frame.Show()
app.MainLoop()
精彩评论