运维开发网

python3高级系列06:GUI编程

运维开发网 https://www.qedev.com 2021-02-27 08:27 出处:51CTO 作者:mb5fdb0a4002420
本节我们学习使用python3进行GUI(图形用户界面)编程,简单来说就是类似电脑端QQ。python有许多GUI工具组件,小编使用过Tkinter和wxPython,语法上基本大同小异,本节我们就使用wxPython来编程。下面我们创建一个窗口。import wxapp = wx.App()frame = wx.Frame(parent=None,title='gui',pos=(50,30),

本节我们学习使用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()

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号