python中GUI界面编程

#python day12

1 首先通过pip安装wxPython

快捷键Ctrl+R,输入cmd,然后编写以下命令行:

pip install -U wxPython

2 创建一个wx.app的子类

在这里插入图片描述

import wx
#导入wxpython



class App(wx.App):       #继承父类wx.App
    def OnInit(self):
        frame =wx.Frame(parent = None,title = 'HelloWorld')   #创建窗口
        frame.Show()         #显示窗口
        return True     #返回值
if __name__ == '__main__':
    app = App()     #实例化子类
    app.MainLoop()  #调用主循环方法

在这里插入图片描述

3 使用wx.Frame框架

在这里插入图片描述

import wx      #导入wxpython模块
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()                   #调用主循环方法

在以上代码中,在主程序中调用MyFrame类,并且传递两个参数。在MyFrame类中,自动执行__init__()初始化方法,接收参数。然后调用父类wx.Frame的__init__()初始化方法,设置顶级窗口的相关属性。运行截图如下:

在这里插入图片描述

4 StaticText文本类控件

实例01 使用wx.StaticText输出python之禅

import  wx   #导入wxpython模块
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 = 'The Zen of Python, by Tim Peters',pos = (100,20))
        wx.StaticText(panel, label = 'Beautiful is better than ugly.',pos = (50,50))
        wx.StaticText(panel, label='Explicit is better than implicit.', pos=(50, 70))
        wx.StaticText(panel, label='Simple is better than complex.', pos=(50, 90))
        wx.StaticText(panel, label='Complex is better than complicated.', pos=(50, 110))
        wx.StaticText(panel, label='Flat is better than nested.', pos=(50, 130))
        wx.StaticText(panel, label='Sparse is better than dense.', pos=(50, 150))
        wx.StaticText(panel, label='Readability counts.', pos=(50, 170))
        wx.StaticText(panel, label='Special cases arent special enough to break the rules.', pos=(50, 190))
        wx.StaticText(panel, label='Although practicality beats purity.', pos=(50, 210))
        wx.StaticText(panel, label='Errors should never pass silently.', pos=(50, 230))
        wx.StaticText(panel, label='Unless explicitly silenced.', pos=(50, 250))
        wx.StaticText(panel, label='In the face of ambiguity, refuse the temptation to guess.', pos=(50, 270))
        wx.StaticText(panel, label='There should be one-- and preferably only one --obvious way to do it.', pos=(50, 290))
        wx.StaticText(panel, label='Although that way may not be obvious at first unless you are Dutch.', pos=(50, 310))
        wx.StaticText(panel, label='Now is better than never.', pos=(50, 330))

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

运行截图

5 TextCtrl输入文本类控件

在这里插入图片描述
实例02 使用wx.TextCtrl实现登陆界面

import wx      #导入wxpython模块
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, label='密码:', pos=(50, 90))
        self.text_password = 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)   #实现Myframe类,并传递参数
    frame.Show()                            #显示窗口
    app.MainLoop()                   #调用主循环方法

在这里插入图片描述

6 Button按钮类控件

实例03 为登陆界面添加‘确认’和‘取消’

import wx      #导入wxpython模块
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, label='密码:', pos=(50, 90))
        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)   #实现Myframe类,并传递参数
    frame.Show()                            #显示窗口
    app.MainLoop()                   #调用主循环方法

在这里插入图片描述

7 使用BoxSizer布局

BoxSizer是在一条水平或垂直线上的窗口部件的布局。具体在这里就不赘述了,有兴趣的读者可以自行查一下。

import wx      #导入wxpython模块
class MyFrame(wx.Frame):      #创建一个子类继承父类
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title = '创建boxsizer',size = (400,300))  #调用父类构造方法
        panel = wx.Panel(self)
        self.title = wx.StaticText(panel,label = '请输入用户名和密码') #创建文本框
        self.label_user = wx.StaticText(panel,label = '用户名:')    #创建用户名文本框
        self.text_user = wx.TextCtrl(panel, style =wx.TE_LEFT)   #创建用户名输入框
        self.label_pwd = wx.StaticText(panel, label='密   码:')   #创建密码文本框
        self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD)  #创建密码输入框
        self.bt_confirm = wx.Button(panel,label = '确定')   #创建确定按钮
        self.bt_cancel = wx.Button(panel, label='取消',)    #创建取消按钮
        #添加容器,将容器中控件横向排列
        hsizer_user = wx.BoxSizer(wx.HORIZONTAL)  #HORIZONTAL是横向排列,每创建一个容器,容器中控件为一组
        hsizer_user.Add(self.label_user,proportion = 0,flag = wx.ALL,border  =5)
        hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
        hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
        hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
        hsizer_button.Add(self.bt_cancel, proportion=1, 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)   #实现Myframe类,并传递参数
    frame.Show()                            #显示窗口
    app.MainLoop()                   #调用主循环方法

在这里插入图片描述
在这里插入图片描述
这次登录界面随着窗口放大缩小而改变,笔者认为在平时的使用中,使用BoxSizer布局会更加美观,当然也可以选择其他布局。

8 使用事件判断用户登录

什么是事件?用户执行的动作就叫事件,如果说单击按钮就是一个简单事件。

bt_confirm.Bind(wx.EVT_BUTTON,OnclickSubmit)
#wx.EVT_BUTTON:事件类型为按钮类型。wx.EVT_开头的都是事件类型。
#OnclickSubmit:方法名。事件发生时执行该方法。
import wx      #导入wxpython模块
class MyFrame(wx.Frame):      #创建一个子类继承父类
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,title = '创建boxsizer',size = (400,300))  #调用父类构造方法
        panel = wx.Panel(self)
        self.title = wx.StaticText(panel,label = '请输入用户名和密码') #创建文本框
        self.label_user = wx.StaticText(panel,label = '用户名:')    #创建用户名文本框
        self.text_user = wx.TextCtrl(panel, style =wx.TE_LEFT)   #创建用户名输入框
        self.label_pwd = wx.StaticText(panel, label='密   码:')   #创建密码文本框
        self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD)  #创建密码输入框
        self.bt_confirm = wx.Button(panel,label = '确定')   #创建确定按钮
        self.bt_confirm.Bind(wx.EVT_BUTTON,self.OnclickSubmit)  #绑定事件
        self.bt_cancel = wx.Button(panel, label='取消',)    #创建取消按钮
        self.bt_cancel.Bind(wx.EVT_BUTTON, self.OnclickCancel)   #绑定事件
        #添加容器,将容器中控件横向排列
        hsizer_user = wx.BoxSizer(wx.HORIZONTAL)  #HORIZONTAL是横向排列,每创建一个容器,容器中控件为一组
        hsizer_user.Add(self.label_user,proportion = 0,flag = wx.ALL,border  =5)
        hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
        hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
        hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)
        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)
        hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
        hsizer_button.Add(self.bt_cancel, proportion=1, 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)
        #事件发生要执行的方法
    def OnclickSubmit(self,event):
        message = ''
        username = self.text_user.GetValue()
        password = self.text_password.GetValue()
        if username == '' or password == '' :
            message = '用户名或密码不能为空'
        elif username == 'muxing' and password == '123456' :
            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)   #实现Myframe类,并传递参数
    frame.Show()                            #显示窗口
    app.MainLoop()                   #调用主循环方法

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值