码迷,mamicode.com
首页 > 其他好文 > 详细

第十六天 第十二章 GUI

时间:2020-09-10 22:59:39      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:屏幕   自绘   函数   win   类型   布局   用户登陆   多点   应用   

# GUI是Graphical User Interface(图形用户界面)的缩写。GUI程序有3个基本要素:输入、处理和输出。

# 常用的GUI框架
# wxPython:
# Kivy:开源,主要关注创新型用户界面开发,如多点触摸应用程序。
# Flexx:纯python工具包,可使用web技术进行界面渲染
# PyQt:是Qt库的python版本,支持跨平台
# Tkinter:也叫TK接口,是TK图形用户界面工具包标准的python接口,轻量级跨平台图形用户界面开发工具
# Pywin32:像VC一样的形式来开发win32应用
# PyGTK:轻松创建具有图形界面的程序
# pyui4win:开源的采用自绘技术的界面库
# ==========使用哪个工具包取决于你的应用场景==========


# 这里讲的是wxPython工具包:http://wxpython.org
# 安装命令:pip install -u wxPython
# 使用前,先来了解两个基础对象:应用程序对象和顶级窗口

# 应用程序对象管理主事件循环,主事件循环是wxPython程序的动力。没它不行。
# 顶级窗口通常用于管理最重要的数据,控制并呈现给用户。
# 应用程序对象拥有顶级窗口和主循环事件。顶级窗口管理其窗口中的组件和其它的分配给它的数据对象,窗口和它的组件触发的事件基于用户的动作,并接受事件通知以改变显示。
# 创建一个wx.App子类
# 在创建应用程序之前,先创建一个没有任何功能的子类。步骤如下:
# 1 定义这个子类
# 2 在定义的子类中写一个OnInit()初始化方法
# 3 在程序的主要部分创建这个类的一个实例
# 4 调用应用程序实例的MainLoop()方法。这个方法将程序的控制权交给wxPython。
# _*_ coding:utf-8 _*_
import wx
class App(wx.App):
    # 初始化方法
    def OnInit(self):
        fram = wx.Frame(parent=None, title=Hello Python) # 创建窗口
        fram.Show() # 显示窗口
        return True # 返回值

if __name__ == __main__:
    app = App() # 创建App类的实例
    app.MainLoop() # 调用App类的MainLoop()主循环方法
# 使用wx.Frame框架:在GUI中框架通常也称为窗口。框架是一个容器,用户可以将它在屏幕上任意移动,并可对它进行缩放
#    它通常包含标题栏、菜单等。在wxPython中,wx.Frame是所有框架的父类。当你创建wx.Frame的子类时,子类应该
#    调用其父类的构造器wx.Frame.__init__()。



# 使用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:关于新窗口的wxPython ID号。通常设为-1,让wxPython自动生成一个新的ID。
title:窗口的标题。
pos:一个wx.Point对象,它指定这个新窗口的左上角在屏幕中的位置。在图形用户界面程序中,通常(0,0)是显示器的左上角。默认是(-1,-1),是系统决定窗口初始位置。
size:一个wx.Size对象,它指定这个窗口的初始尺寸。默认是(-1,-1),是系统决定窗口初始尺寸。
name:框架内在的名字。可以使用它来寻找这个窗口。
‘‘‘

‘‘‘ ========== 创建一个窗口(调用父类__init__方) ==========‘‘‘
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()
‘‘‘
=================== 文本 =====================
wx.StaticText(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, name="staticText")

parent:父窗口部件
id:标识符。使用-1可以自动创建一个唯一的标识
label:显示在静态控件中的文本内容。
pos:一个wx.Point或一个Python元组,它是窗口部件的位置
size:一个wx.Size或一个Python元组,它是窗口部件的尺寸
style:样式标记
name:对象的名字
‘‘‘

# _*_ coding:utf-8 _*_
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之禅--Tim Peters, pos=(100,20))
        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,70))
        wx.StaticText(panel, label=简明胜于复杂, pos=(50,90))
        wx.StaticText(panel, label=复杂胜于凌乱, pos=(50,110))
        wx.StaticText(panel, label=扁平胜于嵌套, pos=(50,130))
        wx.StaticText(panel, label=间隔胜于紧凑, pos=(50,150))
        wx.StaticText(panel, label=可读性很重要, pos=(50,170))
        wx.StaticText(panel, label=即便假借特例的实用性之名,也不可违背这些规则, pos=(50,190))
        wx.StaticText(panel, label=不要包容所有错误,除非你确定需要这样做, pos=(50,210))
        wx.StaticText(panel, label=当存在多种可能,不要尝试去猜测, pos=(50,230))
        wx.StaticText(panel, label=而是尽量找一种,最好是唯一一种明显的解决方案, pos=(50,250))
        wx.StaticText(panel, label=虽然这并不容易,因为你不是 Python 之父, pos=(50,270))
        wx.StaticText(panel, label=做也许好过不做,但不假思索就动手还不如不做, pos=(50,290))
        wx.StaticText(panel, label=如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然, pos=(50,310))
        wx.StaticText(panel, label=命名空间是一种绝妙的理念,我们应当多加利用, pos=(50,330))

if __name__ == __main__:
    app = wx.App()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
# 构造函数如下:
‘‘‘
wx.TextCtrl(parent,id,value="",pos=wx.DefaultPosition,size=wx.DefaultSize,style=0,validator=wx.DefaultValidator name=wx.TextCtrlNameSter
style:单行wx.TextCtrl的样式,取值及说明如下:
    wx.TE_CENTER:控件中的文本剧中
    wx.TE_LEFT:控件中的文本居左
    wx.TE_NOHIDESEL:文本始终高亮显示,只适用于Windows
    wx.TE_PASSWORD:不显示所键入的文本,以星号代替显示
    wx.TE_PROCESS_ENTER:如果使用改参数,当用户按下回车键时,一个文本输入事件将被触发。否则按键事件由该文本控件或该对话框管理
    wx.TE_PROCESS_TAB:如果指定这个样式,一般意味创建一个制表符,否则由对话框管理,通常是控件间的切换
    wx.TE_READONLY:文本控件为只读,用户不能修改其中的文本
    wx.TE_RIGHT:控件中的文本右对齐
value:显示在该控件中的初始文本
validator:常用于过滤数据以确保只能键入要接受的数据
‘‘‘

# 实现登陆界面
# _*_ 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,label="密  码:",pos=(50,90))
        self.text_pwd=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()  # 调用主循环方法
# 按钮是GUI界面应用最广泛的控件,常用于捕获用户生成的事件,其最明显的用途是触发绑定到一个处理函数。
# wxPython类库提供不同类型的按钮,其中最常用的是wx.Button类,构造函数如下:
‘‘‘
wx.Button(parent,id,label,pos,size=wxDefaultSize,style=0,validator,name="button")
‘‘‘

# 为登陆界面添加确认和取消按钮

# _*_ 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,label="密  码:",pos=(50,90))
        self.text_pwd=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(None,-1)
    frame.Show()
    app.MainLoop()
# 1/2/3/4/5笔记中都是用的绝对坐标控制控件的位置,是固定的。当窗口调整大小时,界面就会变的不美观。
# 而sizer(尺寸器)是用于自动布局一组窗口控件的算法。sizer被附加到容器时,它随后就可以管理它所包含的子布局。
# wxPython提供了5个sizer,如下:
‘‘‘
BoxSizer:在一条水平或垂直线上的窗口部件的布局。当尺寸改变时,控制窗口部件的行为上很灵活。通常用于嵌套的样式,可用于几乎任何类型的布局
GridSizer:一个十分基础的风格布局。当你要放置的窗口部件都是同样的尺寸且整齐地放入一个规则的网格中可以使用它
FlexGridSizer:对GridSizer稍微做了些改变,当窗口部件有不同的尺寸时,可以有更好的结果
GridBagSizer:GridSizer系列中最灵活的成员,使得网格中的窗口部件可以随意放置
StaticBoxSizer:一个标准的BoxSizer。带有标题和环线
‘‘‘

# 使用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)    # 首先设置增加背景控件(wx.Panel)
        self.title=wx.StaticText(panel,label="请输入用户名和密码")
        # 添加容器,容器中的控件按纵向排列
        vsizer=wx.BoxSizer(wx.VERTICAL) # ,并创建一个wx.BoxSizer,参数设为垂直,默认水平
        # 然后使用Add方法将控件加入sizer
        vsizer.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER,border=15)
        # 最后用SetSizer方法设定它的尺寸器
        panel.SetSizer(vsizer)

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

‘‘‘   ===   Add()方法格式   ===
Box.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))=20,按钮3约为30。
flag:flag参数与border参数结合使用可以指定边距宽度,包括以下选项:
    wx.LEFT:左边距
    wx.RIGHT:右边距
    wx.BOTTOM:底边距
    wx.TOP:上边距
    wx.ALL:上下左右4个边距
    可以使用“|”操作符,联合使用这些标志。另外,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:控制所添加控件的边距,就是在部件之间添加一些像素的空白
‘‘‘
# 使用BoxSizer设置登陆界面

# _*_ coding:utf-8 _*_
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.btn_confirm=wx.Button(panel,label=确定)
        self.btn_cancel=wx.Button(panel,label=取消)

        # 创建文本,左对齐
        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_pwd=wx.TextCtrl(panel,style=wx.TE_RIGHT)

        # 添加容器,容器中的控件横向排列
        hsizer_user=wx.BoxSizer(wx.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_pwd,proportion=1,flag=wx.ALL,border=5)

        hsizer_btn=wx.BoxSizer(wx.HORIZONTAL)
        hsizer_btn.Add(self.btn_confirm,proportion=0,flag=wx.ALIGN_CENTER,border=5)
        hsizer_btn.Add(self.btn_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=5)
        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_btn,proportion=0,flag=wx.ALIGN_CENTER|wx.TOP,border=15)

        panel.SetSizer(vsizer_all)

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


‘‘‘
在上述代码中,首先创建按钮和文本控件,然后将其添加到容器中,并且设置横向排列。接着,设置纵向排列。在布局的过程中,通过设置每个控件的flag和border参数
实现控件位置间的布局。至此,使用BoxSizer将绝对位置布局改为相对位置布局。
‘‘‘
# 当发生一个事件时,需要让程序注意这些事件并且做出反应。这时,可以将函数绑定到所涉及事件可能发生的控件上。
# 当事件发生时,函数就会被调用。利用控件的Bind()方法可以将事件处理函数绑定到给定的事件上。如:为确定添加一个单击事件
‘‘‘
bt_confim.Bind(wx.EVT_BUTTON,OnclickSubmit)
wx.EVT_BUTTON:事件类型为按钮类型
OnclickSubmit:方法名。事件发生时执行该方法
‘‘‘

# ===========  使用事件判断用户登陆  ==========
# 如果用户名为“admin”且密码为“admin”,则弹出登陆成功提示框,否则弹出登陆失败提示框,点击取消则清空用户名和密码


# -*- 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.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)
        # 创建文本,左对齐        
        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)
        # 添加容器,容器中控件按横向并排排列
        hsizer_user = wx.BoxSizer(wx.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=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)

    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)  # 实例MyFrame类,并传递参数    
    frame.Show()                        # 显示窗口
    app.MainLoop()                      # 调用主循环方法

 

第十六天 第十二章 GUI

标签:屏幕   自绘   函数   win   类型   布局   用户登陆   多点   应用   

原文地址:https://www.cnblogs.com/zack6688/p/13584740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!