python学习笔记七(WxPython-GUI)

安装wxpython

windows的cmd下执行命令:pip install -U wxPython

运行原理

应用程序对象:管理主事件循环,主事件循环是wxPython程序的动力。如果没有应用程序对象,wxPython应用程序将不能运行。
顶级窗口:通常用于管理最重要的数据,控制并呈现给用户。
python学习笔记七(WxPython-GUI)_第1张图片

创建一个简单的窗口

import wx  #导入wxPython
class App(wx.App):
    def OnInit(self):  #初始化方法
        frame = wx.Frame(parent=None,title="123") #创建窗口
        frame.Show()  #显示窗口
        return True   #返回值
if __name__ == "__main__":
    app = App()  #创建实例
    app.MainLoop() #主循环方法
import wx   #导入wxPython
app = wx.App()  #初始化wx.App类
frame = wx.Frame(None,title="123321")  #定义窗口
frame.Show()   #显示窗口
app.MainLoop()  #调用主循环

wx.Frame框架

语法:wx.Frame(parent,id=-1,title=””,pos=(,),size=(,)style=,name=)
parent:框架父窗口,如果是顶级窗口,则值为None
id:关于新窗口的wxPythonID号。通常设为-1,让wxPython自动生成-一个 新的ID。
title:窗口标题
pos:新窗口的左上角在屏幕中的位置。在图形用户界面程序中,通常(0,0)是显示器的左上角。这个默认值(-1,-1)将让系统决定窗口的位置。
size:窗口的初始尺寸。这个默认值(-1,- 1)将让系统决定窗口的初始尺寸。
style:窗口的类型的常量。可以使用或运算来组合它们。
name:框架内在的名字。可以使用它来寻找这个窗口
import wx
class MyFrame(wx.Frame): #定义窗口类,
    def __init__(self,parent,id): #调用MyFrame类,并且传递2个参数
        #调用父类wx.Frame的__init__初始化方法,设置顶级窗口的相关属性
        wx.Frame.__init__(self,parent,id,title="123",pos=(100,300),size=(90,90))
if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()
import wx
app = wx.App()
frame = wx.Frame(parent=None,id=-1,title="123",pos=(100,300),size=(90,90))
frame.Show()
app.MainLoop()

控件

纯文本模式(静态文本)static text

语法:

wx.StaticText(parent,id,label,pos,size,style,name)
parent:父窗口部件。
id:标识符。使用-1可以自动创建一个唯一的标识。
label :显示在静态控件中的文本内容。
pos:-一个wx.Point或一个Python元组,它是窗口部件的位置。
size:一个wx.Size或一个Python元组,它是窗口部件的尺寸。
style:样式标记。
name:对象的名字。
import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        #调用父类wx.Frame的__init__初始化方法,设置顶级窗口的相关属性
        wx.Frame.__init__(self,parent,id,title="静态文本测试窗口",pos=(200,230),size=(600,403))

        #创建一个画板,以下操作皆在画板下操作
        panel = wx.Panel(self)

        #创建标题,个性化字体
        title = wx.StaticText(panel,label="我是标题",pos=(100,25)) #定义文本内容与文本位置
        font = wx.Font(16,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL) #定义一个字体
        title.SetFont(font) #应用个性化的字体模式

        #创建文本内容
        wx.StaticText(panel,label="我是第一行",pos=(50,50))
        wx.StaticText(panel, label="我是第二行", pos=(50,80))
        wx.StaticText(panel, label="我是第三行", pos=(50,110))
        wx.StaticText(panel, label="我是第四行", pos=(50,140))

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

wx.Font字体样式详解

语法:

wx.Font(pointSize,family,style,weight,unberline=False,faseName=””,encoding)
pointSize:字体的整数尺寸,单位为磅。
amily:用于快速指定一个 字体而不需要知道该字体实际的名字。
style:指明字体是否倾斜。
weight :指明字体的醒目程度。
underline:仅在Windows系统下有效,如果取值为True,则加下划线,如果为False则无下划线。
faceName:指定字体名。
encoding : .
允许在几个编码中选择一个,大多数情况可以使用默认编码。

文本输入框 TextCtrl

语法:

wx.TextCtrl(parent,id,value=””,pos,size,style,validator,name)
style:单行wx.TextCtrl的样式,取值及说明如下:
	➢wx.TE_ CENTER:控件中的文本居中。
	➢wx.TE_ LEFT:控件中的文本左对齐。
	➢wx.TE_ _NOHIDESEL:文本始终高亮显示,只适用于Windows。
	➢wx.TE_ PASSWORD: 不显示所键入的文本,以星号(*) 代替显示。
	➢wx.TE_ _PROCESS_ ENTER:如果使用改参数,那么当用户在控件内按下<Enter>键时,一个文本输入事件将被触发。否则,按键事件由该文本控件或该对话框管理。
	➢wx.TE_ PROCESS_ _TAB: 如果指定了这个样式,那么通常的字符事件在按下<Tab>键时创建(一般意味一个制表符将被插入文本)。否则, tab由对话框来管理,通常是控件间的切换。
	➢wx.TE_ READONLY :文本控件为只读,用户不能修改其中的文本。
	➢wx.TE_ _RIGHT :控件中的文本右对齐。
value:显示在该控件中的初始文本。
validator :常用于过滤数据以确保只能键入要接受的数据。
import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="文本输入框测试",pos=(500,200),size=(400,350))
        #创建画板
        panel = wx.Panel(self)
        #创建文本框
        wx.StaticText(panel,label="输入用户名与密码",pos=(150,30))
        wx.StaticText(panel,label="用户名",pos=(70,50))
        wx.StaticText(panel,label="密码",pos=(70,80))
        #创建输入框
        wx.TextCtrl(panel,pos=(110,50),size=(200,30),style=wx.TE_LEFT)
        wx.TextCtrl(panel,pos=(110,85),size=(200,30),style=wx.TE_LEFT)
if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

创建按钮

按钮是GUI界面中应用最为广泛的控件,它常用于捕获用户生成的单击事件,其最明显的用途是触发绑定到一个处理函数

import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="文本输入框测试",pos=(500,200),size=(400,350))
        #创建画板
        panel = wx.Panel(self)
        #创建文本框
        wx.StaticText(panel,label="输入用户名与密码",pos=(150,30))
        wx.StaticText(panel,label="用户名",pos=(70,50))
        wx.StaticText(panel,label="密码",pos=(70,80))
        #创建输入框
        wx.TextCtrl(panel,pos=(110,50),size=(200,30),style=wx.TE_LEFT)
        wx.TextCtrl(panel,pos=(110,85),size=(200,30),style=wx.TE_LEFT)
        #创建确认与取消按钮
        wx.Button(panel,label="确认",pos=(140,115))
        wx.Button(panel,label="取消",pos=(220,115))
if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

布局

从前面代码可以看出,使用pos布局非常麻烦,下面介绍BoxSizer布局方式
BoxSizer是wxPython所提供的sizer中的最简单和最灵活的。一个BoxSizer是一个垂直列或水平行,窗口部件在其中从左至右或从上到下布置在一条线上。虽然这听起来好像用处不大,但是来自相互之间嵌套sizer的能力使你能够在每行或每列很容易放置不同数量的项目。由于每个sizer都是一个独立的实体,因此你的布局就有了更多的灵活性。对于大多数的应用程序,一个嵌套水平sizer的垂直sizer将使你能够创建你所需要的布局。

import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="我是窗口名称",pos=(-1,-1),size=(400,300)) #调用父类wx.Frame的__init__初始化方法,设置顶级窗口的相关属性
        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() #调用主循环事件

vsizer.Add()语法格式如下

vsizer.Add(control,proportion,flag,border)

control: 要添加的控件。

proportion:所添加控件在定义的定位方式所代表方向上占据的空间比例。如果有三个按钮,
它们的比例值分别为0、1和2,它们都已添加到一个宽度为30的水平排列wx.BoxSizer,起始宽度都是10。当sizer的宽度从30变成60时,按钮1的宽度保持不变,仍然是10,按钮2的宽度约为(10+ (60 -30) *1/(1+2))=30,按钮2约为20。

flag:flag参数与border参数结合使用可以指定边距宽度,包括以下选项:
	➢wx.LEFT :左边距
	➢wx.RIGHT :右边距
	➢wx.BOTTOM :底边距
	➢wx.TOP :. 上边距
	➢wx.ALL: 上下左右4个边距
	可以通过竖线“|”操作符(operator), 来联合使用这些标志,比如wx.LEFT| wx BOTTOM。此
外,flag 参数还可以与proportion参数结合,指定控件本身的对齐(排列)方式,包括以下选项:
	➢wx.ALIGN_ LEFT:左边对齐
	➢wx.ALIGN_ RIGHT:右边对齐
	➢wx.ALIGN_ _TOP: 顶部对齐
	➢wx.ALIGN_ _BOTTOM:底边对齐.
	➢wx.ALIGN_ CENTER _VERTICAL:垂直对齐
	➢wx.ALIGN_ CENTER_ HORIZONTAL:水平对齐
	➢wx.ALIGN_ CENTER:居中对齐
	➢wx.EXPAND: 所添加控件将占有sizer 定位方向上所有可用的空间
	
boder:控制所添加控件的边距,就是在部件之间添加一些像素的空白
import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="最终测试",pos=(200,300),size=(400,300))
        panel = wx.Panel(self)

        #创建静态文本
        self.title = wx.StaticText(panel,label="请输入用户名与密码")
        self.user = wx.StaticText(panel,label="用户名")
        self.pwd = wx.StaticText(panel,label="密   码")
        #创建文本输入框
        self.input_user = wx.TextCtrl(panel,style=wx.TE_LEFT)
        self.input_pwd = wx.TextCtrl(panel,style=wx.TE_PASSWORD)
        #创建按钮
        self.confirm = wx.Button(panel,label="确定")
        self.cancel = wx.Button(panel, label="取消")

        #创建横向排列的容器
        #用户名
        hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_user.Add(self.user,proportion=0,flag=wx.ALL,border=5)
        hsizer_user.Add(self.input_user,proportion=1,flag=wx.ALL,border=5)
        #密码
        hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_pwd.Add(self.pwd,proportion=0,flag=wx.ALL,border=5)
        hsizer_pwd.Add(self.input_pwd,proportion=1,flag=wx.ALL,border=5)
        #按钮
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)
        hsizer_button.Add(self.cancel,proportion=0,flag=wx.ALIGN_CENTER,border=5)

        #创建纵向排列的容器
        vsizer_all = wx.BoxSizer(wx.VERTICAL)
        vsizer_all.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=15)
        vsizer_all.Add(hsizer_user, proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)
        vsizer_all.Add(hsizer_pwd, proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)
        vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER|wx.TOP,border=15)
        panel.SetSizer(vsizer_all)
if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

事件处理

绑定按钮事件

import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="最终测试",pos=(200,300),size=(400,300))
        panel = wx.Panel(self)

        #创建静态文本
        self.title = wx.StaticText(panel,label="请输入用户名与密码")
        self.user = wx.StaticText(panel,label="用户名")
        self.pwd = wx.StaticText(panel,label="密   码")
        #创建文本输入框
        self.input_user = wx.TextCtrl(panel,style=wx.TE_LEFT)
        self.input_pwd = wx.TextCtrl(panel,style=wx.TE_PASSWORD)
        #创建按钮
        self.confirm = wx.Button(panel,label="确定")
        self.cancel = wx.Button(panel, label="取消")

        #创建横向排列的容器
        #用户名
        hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_user.Add(self.user,proportion=0,flag=wx.ALL,border=5)
        hsizer_user.Add(self.input_user,proportion=1,flag=wx.ALL,border=5)
        #密码
        hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_pwd.Add(self.pwd,proportion=0,flag=wx.ALL,border=5)
        hsizer_pwd.Add(self.input_pwd,proportion=1,flag=wx.ALL,border=5)
        #按钮
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)
        hsizer_button.Add(self.cancel,proportion=0,flag=wx.ALIGN_CENTER,border=5)

        #创建纵向排列的容器
        vsizer_all = wx.BoxSizer(wx.VERTICAL)
        vsizer_all.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=15)
        vsizer_all.Add(hsizer_user, proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)
        vsizer_all.Add(hsizer_pwd, proportion=0,flag=wx.EXPAND|wx.LEFT|wx.RIGHT,border=45)
        vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER|wx.TOP,border=15)
        panel.SetSizer(vsizer_all)

        #绑定按钮事件
        self.confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)
        self.cancel.Bind(wx.EVT_BUTTON,self.OnclickCancel)

    def OnclickSubmit(self,event):
        message = ""
        username = self.input_user.GetValue()
        password = self.input_pwd.GetValue()
        if username == "" or password == "":
            message = "用户名与密码不能为空"
        elif username == "小桃子" and password == "*.*":
            message = "登录成功"
        else:
            message = "输入错误"
        wx.MessageBox(message)

    def OnclickCancel(self,event):
        self.input_user.SetValue("")
        self.input_pwd.SetValue("")

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(parent=None,id=-1)
    frame.Show()
    app.MainLoop()

可使用wxFormBuilder工具绘制UI界面

python学习笔记七(WxPython-GUI)_第2张图片

你可能感兴趣的:(python)