pythonGUI基础

GUI简介

GUI是Graphical User Interface(图形用户界面)的缩写。在GUI中,并不只是输入文本和返回文本,用户可以看到窗口、按钮、文本框等图形,而且可以用鼠标单击,还可以通过键盘输入。GUI是与程序交互不同的一种方式。GUI有三个基本要素:输入、处理和输出。

工具包描述
wxPythonpython语言的一套GUI图形库,可以方便地创建完整的GUI用户界面
Kivy开源工具包,能让相同源代码创建的程序跨平台运行
Flexx纯python工具包,用来创建图形化界面应用程序。使用Web技术进行界面的渲染
PyQt是Qt库的python版本,支持跨平台
Tkinter是TK图形用户界面工具包标准的python接口。TK是一个轻量级的跨平台图形GUI开发工具
Pywin32允许用户像VC一样使用python开发win32应用
PyGTK让用户轻松创建具有图形用户界面的程序
pyui4win开源的采用自绘技术的界面库

使用wx.Frame框架

在GUI中,框架通常也成为窗口。在wxPython中,wx.Frame是所有框架的父类。当用户创建wx.Frame的子类时,子类应该调用父类的构造器wx.Frame.____init()。wx.Frame的构造器语法格式如下

wx.Frame(parent,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=wx.DEFAULT_FRAME          _STYLE,name="frame")

parent:框架的父窗口,如果是顶级窗口,这个值是None

id:关于新窗口的wxPythonID号。通常设为-1,让wyPython自动给生成一个新的id

title:窗口的标题

pos:一个wx.Point对象,它指定这个新窗口的左上角在屏幕中的位置。在图形用户界面程序中,通常(0,0)是显示器的左上角。这个默认的(-1,-1)将让系统决定窗口的位置。

size:一个wx.Size对象,它指定这个窗口的初始尺寸。默认的(-1,-1)将让系统决定窗口的初始尺寸。

style:指定窗口的类型的常量。可以使用或运算来组合它们。

name:框架的内在的名字,可以用它来寻找这个窗口。

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)
    frame.Show()
    app.MainLoop()

结果如下:
在这里插入图片描述

StaticText文本类

对于所有的UI工具来说,最基本的任务就是在屏幕上绘制纯文本。在wxPython中,可以使用wx.StaticText类来完成。使用wx.StaticText能够改变文本的对齐方式、字体和颜色等。构造函数语法如下:

wx.StaticText(parent,id,label,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,name="staticTex               t")

parent:父窗口插件

id:使用-1可以自动创建一个唯一的标识

label:显示在静态控件中的文本内容

pos:一个wx.Point或者一个Python元组,它是窗口部件的位置

size:一个wxSize或者一个Python元组,它是窗口部件的尺寸

style:样式标记

name:对象的名字

import wx

class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="创建StaticText类",pos=(100,100),size=(600,400))
        panel = wx.Panel(self)#创建画板
        #创建标题,并设置字体
        title = wx.StaticText(panel,label="python",pos=(100,20))
        font = wx.Font(16,wx.DEFAULT,wx.FONTSTYLE_NORMAL,wx.NORMAL)
        title.SetFont(font)
        #创建文本
        wx.StaticText(panel,label='人生苦短,我用python',pos=(50,50))


if __name__ == '__main__':
    app = wx.App()#初始化应用
    frame = MyFrame(parent=None, id=-1)#实例化MyFrame类,并传递参数
    frame.Show()#显示窗口
    app.MainLoop()#调用主循环方法

在这里插入图片描述

TextCtrl输入文本类

wx.wx.StaticText只能用于显示纯粹的静态文本,但是有时需要输入文本与用户进行交互,此时需要TextCtrl文本类,它允许输入单行和多行文本,也可以作为密码输入控件,掩饰所按下的按键。

wx.TextCtrl(parent,id,value="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,validator=wx.D             efaultValidator,name=wx.TextCtrlNameStr)

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="创建",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.label_pwd= wx.StaticText(panel, label="密 码", pos=(50, 90))
        self.text_user=wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
        self.text_user = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)


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

在这里插入图片描述

Button按钮类

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

wx.Button(parent,id,label,pos,size=wxDefaultSize,style=0,validator,name="button")
import wx
class MyFrame(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title="创建",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.label_pwd= wx.StaticText(panel, label="密 码", pos=(50, 90))
        self.text_user=wx.TextCtrl(panel,pos=(100,50),size=(235,25),style=wx.TE_LEFT)
        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提供了5个Sizer,BoxSizer是其中最简单和灵活的。

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="请输入用户名和密码")
        #添加容器,容器中控件按纵向排列
        v=wx.BoxSizer(wx.VERTICAL)
        v.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=15)
        panel.SetSizer(v)



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

在这里插入图片描述

Add()语法格式如下:

Box_Add(control,proportion,flag,border)

control:要添加的控件

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

flag:flag参数与border参数结合使用可以指定边距宽度:

  • wx.LEFT:左边距

  • wx.RIGHT:右边距

  • wx.BOTTOM:底边距

  • wx.TOP:上边距

  • wx.ALL:上下左右四个边距

可以通过竖线“|”操作符来联合使用这些标志,比如wx.LEFT|WX.BOTTOM.
flag还可以与proportion参数结合,指定控件本身的对齐方式:

  • wx.ALIGN_LEFT:左边对齐
  • wx.ALIGN_RIGHT:右边对齐
  • wx.ALIGN_TOP:顶部对齐
  • wx.ALIGN_BOTTOM:底边对齐
  • wx.ALIGN_GENTER_VERTICAL:垂直对齐
  • wx.ALIGN_GENTER_HORIZONTAL:水平对齐
  • wx.ALIGN_GENTER:居中对齐
  • wx.EXPAND:所添加控件将占有sizer定位方向上所有可用的空间
  • border:控制所添加控件的边距,就是在部件之间添加一些像素的空白

事件处理

用户执行的动作就叫作事件,比如单击按钮就是一个单击事件

利用控件的Bind()方法可以将事件处理函数绑定到给定的事件上。例如,为“确定”按钮添加一个单击事件,代码如下:

bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)

wx.EVT_BUTTON:事件类型为按钮类型。

wx.EVT_MOTION:用户移动鼠标。

wx.ENTER_WINDOW:用户进入窗口控件

wx.LEAVE_WINDOW:用户离开窗口控件

wx.EVT_MOUSEWHEEL:鼠标滚轮滑动

OnclickSubmit:方法名。事件发生时执行该方法。

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.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)
      

        self.title = wx.StaticText(panel, label="请输入用户名和密码", pos=(140, 20))
        self.label_user = wx.StaticText(panel, label="用户名", pos=(50, 50))
        self.label_pwd = wx.StaticText(panel, label="密 码", pos=(50, 90))
        self.text_user = wx.TextCtrl(panel, pos=(100, 50), size=(235, 25), style=wx.TE_LEFT)
        self.text_password = wx.TextCtrl(panel, pos=(100, 90), size=(235, 25), style=wx.TE_PASSWORD)

    def OnclickSubmit(self,event):
        message=""
        username=self.text_user.GetValue()
        password = self.text_password.GetValue()
        if username=="" or password=="":
            message="用户名或密码不能为空"
        elif username =="mr" or 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()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月7日
下一篇 2023年3月7日

相关推荐