python自学 (五)GUI界面编程
为了能在开学后更好地融入实验室,本人计划用一个月的时间进行python3语言入门,该系列笔记适合已经有一门编程语言基础的朋友参考使用,欢迎同道者前来交流~
使用教材:
1.《python从入门到精通》清华大学出版社;(自带教学视频【二维码形式】)
2.《机器学习》周志华(西瓜书) 清华大学出版社;
3.《python机器学习手册》 [美]Xhris Albon;
4. BiliBili 《和美女老师一起学python》视频。
………………………………
GUI——用户界面编程 Graphical User Interface
通过GUI编程,用户在使用软件的时候就可以通过界面对程序进行操作而非对照输入框操作。
python中的GUI开发,有很多工具包可以选择,其中最常用的就是wxPython
………………………………
(一)安装wxPython
打开电脑的cmd界面,输入: pip install -U wxPython 完成
………………………………
(二)创建应用程序
在创建应用程序之前,先来创建一个没有任何功能的子类。
创建一个wx.APP子类,需要执行以下几个步骤:
- 定义这个子类;
- 在定义的子类中写一个 OnInit()初始化方法;
- 在程序的主要部分创建这个类的一个实例;
- 调用应用程序实例的MainLoop()方法,这个方法将程序的控制权交给wxPython。
创建没有功能的子类,具体代码如下:
#-*- coding:utf-8 -*-
import wx
class App(wx.App): #子类继承wx.app
def OnInit(self):
#创建窗口,其中title指定的是窗口的标题
frame=wx.Frame(parent = None, title = 'hello wxPython')
#显示窗口
frame.Show()
#返回值
return True
if __name__=='__main__':
app= App() #创建APP类的实例
app.MainLoop() #调用APP类的MainLoop()主循环方法
………………………………
(三)使用wx.Frame框架
在GUI中,框架通常也称为窗口,框架是一个容器,用户可以将它在屏幕上任意移动或进行缩放。
wx.Frame是所有框架的父类,当用户创建窗口时,就是在建立wx.Frame的子类,这时就会调用它的父类构造器:
wx.Frame.init()
它的语法格式如下:
wx.Frame(parent, id=-1, title = "", pos = wx.DefaultPosition ,size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, name="frame")
参数说明:
参数 | 说明 |
---|---|
parent | 框架的父窗口,如果是*窗口,这个值是None |
id | 关于新窗口的wxPython ID号,通常设置为-1,让其自动生成一个新的ID |
title | 窗口标题 |
size | 指定窗口尺寸 |
style | 可以使用运算来组合,这是一个指定窗口类型的常量 |
name | 框架的内在名字,在程序中用它来寻找窗口 |
pos | 指定窗口左上角在屏幕中的位置 |
创建wx.Frame子类的代码如下:
#-*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def__init__(self,parent,id):
wx.Frame.__init__(self,parent,id,title='创建Frame',pos=(100,100),size=(300,300))
if __name__=='__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None, id=-1) #实例化MyFrame类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用MainLoop()主循环方法
………………………………
(四)窗口常用控件
4.1 纯文本控件 StaticText文本类
wx.StaticText类可以改变文本的对齐方式、字体和颜色等等。
wx.StaticText的构造函数语法格式如下:
wx.StaticText(parent,id,lable,pos = wx,DefaultPosition, size = wx.DefaultSize,style = 0,name = "staticText")
wx.StaticText构造函数的参数:
参数 | 说明 |
---|---|
parent | 父窗口部件 |
id | 关于新窗口的wxPython ID号,通常设置为-1,让其自动生成一个新的ID |
size | 指定窗口尺寸 |
style | 可以使用运算来组合,这是一个指定窗口类型的常量 |
name | 框架的内在名字,在程序中用它来寻找窗口 |
pos | 指定窗口左上角在屏幕中的位置 |
使用举例:
#-*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def__init__(self,parent,id):
#窗口设置
wx.Frame.__init__(self,parent,id,title='创建Frame',pos=(100,100),size=(300,300))
#创建画布
panel = wx.Panel(self)
#创建文本,并设置字体
title = wx.StaticText(panel,label='显示文本内容',pos=(100,200))
font = wx.Font(16,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
title.SetFont(font)
#创建文本
wx.StaticText(panel,label = '保持学习',pos=(50,50))
if __name__=='__main__':
app = wx.App() #初始化应用
frame = MyFrame(parent = None, id=-1) #实例化MyFrame类,并传递参数
frame.Show() #显示窗口
app.MainLoop() #调用MainLoop()主循环方法
其中,wx.Font用于设置字体,创建一个字体实例需要以下构造函数:
wx.Font(pointSize, family, style, weight, underline = False, faceName="",endcoing=wx.FONTENCODING_DEFAULT)
参数说明如下:
参数 | 说明 |
---|---|
pointSize | 字体的整体尺寸,单位为磅 |
family | 用于快速指定一个字体而无需知道该字体的实际名字 |
style | 指明字体是否倾斜 |
weight | 指明字体的醒目程度 |
underline | 是否有下划线 |
faceName | 指定字体名 |
encoding | 允许在几个编码中选择一个,大多数情况使用默认编码 |
运行效果:
………………………………
4.2 输入框 TextCtrl 输入文本类
wx.TectCtrl类 允许输入单行和多行文本,也可以在 输入密码时进行掩码。
wx.TextCtrl类的构造函数为:
wx.TextCtrl(parent,id,value="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,validator=wx.DefaultValidator,name=wx.TextCtrlNameStr)
其中,value参数是初始文本(就是默认显示在对话框里的内容);style参数的可选项很多,如下表所示:
样式 | 说明 |
---|---|
wx.TE_CENTER | 控制文本中的控件居中 |
wx.TE_LEFT | 左对齐 |
wx.TE_NOHIDESEL | 文本高亮(Windows) |
wx.PASSWORD | 不显示所输入的文本,用(*)代替 |
wx.TE_PROCESS_ENTER | 使用该参数,当用户在控件内按enter键时,一个文本输入时间被触发 |
wx.TE_PROCESS_TAB | 一个制表符被插入文本 |
wx.TE_READONLY | 只读模式,不可输入 |
wx.TE_RIGHT | 右对齐 |
一个wx.TextCtrl使用实例:使用wx.TextCtrl来实现登录界面。
#-*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id ,title="创建textctrl类",size=(400,300))
#创建面板
panel = wx.Panel(self)
#创建文本和密码输入框
self.title = wx.StaticText(panel ,label="请输入用户名和密码",pos = (140,20))
self.label_user = wx.StaticText(panel, label="用户名:", pos=(50,50))
self.text_user = wx.TextCtrl(panel,pos=(100,50),size = (235,25),style= wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel,pos = (50,90),label="密 码:")
self.text_password = wx.TextCtrl(panel, pos = (100,90), size=(235,25), style=wx.TE_PASSWORD)
#创建“确定”和“取消”按钮
self.bt_confirm = wx.Button(panel, label = '确定', pos = (105,130))
self.bt_cancel = wx.Button(panel, label = '取消', pos = (195,130))
if __name__ == '__main__':
app=wx.App()
frame = MyFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()
运行结果展示:
这是密码掩码效果:
………………………………
(五)布局 BoxSizer
在wxPython中有一种更为智能的布局方式,使用它就可以不用一个一个地调整控件的位置了。
这就是 Sizer,尺寸器,是一种用于自动布局的窗口控制算法。
———— wxPython 的 sizer说明 ————
sizer名称 | 描述 |
---|---|
BoxSizer | 在一条水平线或是垂直线上的窗口部件的布局。 当尺寸改变时,控制窗口部件的行为很灵活。通过用于嵌套的样式,可用于任何类型的布局。 |
GridSizer | 一个十分基础的 网格布局。 当用户要放置的窗口部件都是同样的尺寸且整齐地方如一个规则的网格中时可以使用它。 |
FlexGridSizer | 对GridSizer稍微做了些改变,当窗口部件有不同的尺寸时,可以有更好的效果。 |
GridBagSier | GridSizer系列中最灵活的成员。使得网格中的窗口部件可以更随意地放置 |
StaticBoxSIzer | 一个标准的BoxSizer,具有标题和环线。 |
#-*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id,'用户登录',size = (400,300))
#创建面板
panel = wx.Panel(self)
self.title = wx.StaticText(panel, label = "请输入用户名和密码")
#添加容器,容器中按纵向排列
vsizer = wx.BoxSizer(wx.VERTICAL)
vsizer.Add(self.title,proportion = 0,flag = wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border = 15)
panel.SetSizer(vsizer)
if __name__ =='__main__':
app = wx.App()
frame = MyFrame(parent = None, id =-1)
frame.Show()
app.MainLoop()
运行效果展示:
………………………………
(六)事件绑定
比如,为按钮添加一个单击事件:
bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)
wxpython中有很多wx.EVT_开头的事件类型。
下面举出一个例子:
【当用户输入用户名和密码后,单击“确定”按钮,如果输入的用户名为mr,并且密码为mrsoft,则弹出对话框“登录成功”;否则显示“用户名和密码不匹配”。
当用户点击“取消”按钮时,清空用户输入的用户名和密码。】
#-*- coding:utf-8 -*-
import wx
class MyFrame(wx.Frame):
def __init__(self,parent,id):
wx.Frame.__init__(self,parent,id ,"用户登录",size=(400,300))
#创建面板
panel = wx.Panel(self)
#创建文本和密码输入框
self.title = wx.StaticText(panel ,label="请输入用户名和密码",pos = (140,20))
self.label_user = wx.StaticText(panel, label="用户名:", pos=(50,50))
self.text_user = wx.TextCtrl(panel,pos=(100,50),size = (235,25),style= wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel,pos = (50,90),label="密 码:")
self.text_password = wx.TextCtrl(panel, pos = (100,90), size=(235,25), style=wx.TE_PASSWORD)
#创建“确定”和“取消”按钮
self.bt_confirm = wx.Button(panel, label = '确定', pos = (105,130))
self.bt_cancel = wx.Button(panel, label = '取消', pos = (195,130))
#绑定按钮事件
self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
self.bt_cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)
def OnclickSubmit(self,event):
'''单击确定按钮执行的步骤'''
message=""
username=self.text_user.GetValue() #获取输入的用户名
password = self.text_password.GetValue() #获取输入的密码
if username == "" or password == "":
message='用户名或密码不能为空'
elif username=='mr' and password == 'mrsoft':
message='登录成功'
else:
message='用户名和密码不匹配'
wx.MessageBox(message)
def OnclickCancel(self,event):
'''单击取消按钮,执行方法'''
self.text_user.SetValue("")
self.text_password.SetValue("")
if __name__ == '__main__':
app=wx.App()
frame = MyFrame(parent=None,id=-1)
frame.Show()
app.MainLoop()
运行效果展示——登录成功:
不匹配:
不能为空:
本文地址:https://blog.csdn.net/Cambridge26/article/details/107313948