自学内容网 自学内容网

python学习-11【图形用户界面】

1、EasyGUI

快速入门

在命令提示符中使用 pip install easygui 命令下载并安装 Easy GUI

功能演示

1、 msgbox() 函数可以显示一个对话框,默认提供名为 OK 的按钮

msgbox(msg='(message)', title='', ok_button='OK', image=None, root=None)

2、ccbox() 函数用于提供选择功能,使用 choice 指定选项

ccbox(msg='', title='', choice=('Continue', 'Cancel'), image=None)

选择 Continue 返回 1(True),选择 Cancel 返回 0(False)

3、buttonbox() 函数自定义一组按钮。
点击任意按钮会返回按钮的文本内容。

buttonbox(msg='', title='', choices=('Button1', 'Button2', 'Button3'), image=None, root=None)

在为 image 参数赋值时,可以设置 .gif 或 .png 格式的图像

4、enterbox() 函数用于为用户提供一个简单的输入框,该函数的返回值就是用户输入的字符串

enterbox(msg='', title='', default='', strip=True, image=None, root=None)

默认返回的值会自定去除首尾空格,当 strip 为 False 时,保留空格。

5、multpasswordbox() 函数可以提供多个输入框,最后一个输入框中会以密码的形式(*)显示输入的信息

multpasswordbox(msg='', title='', fields=(), values=())

import easygui
easygui.multpasswordbox('please input the username and the password:', title='login', field=('username: ', 'password: '))

在这里插入图片描述

2、Tkinter(官方默认)

常用组件

1、Label 组件用于在界面上输出描述内容

from tkinter import *

tk1 = Tk() # 主窗口

lab1 = Label(tk1, text='This is your message............', justify=LEFT, padx=10) # 文本 Label 对象,justify:文字对齐方式,pasx:设置水平位置与边框的距离
lab1.pack(side=RIGHT) # 设置文本 Label 组件的方位

pic = PhotoImage(file='personal.png') # PhotoImage 实例化一个图片对象
pic_lab = Label(tk1, image=pic)
pic_lab.pack(side=LEFT)

mainloop() # 程序进入主事件循环

在这里插入图片描述

2、Button 组件可以生成一个按钮

from tkinter import *
import sys

def fun1():
    var.set('''
    abcdefg,
    hijklmn,
    opqrst,
    uvwxyz. ''')
def back():
    sys.exit(0) # 退出程序

tk1 = Tk()
f1 = Frame(tk1)
f2 = Frame(tk1)
var = StringVar()
var.set('ABCDEFG')
lab1 = Label(f1, textvariable=var, justify=LEFT) # textvariable 参数设置文本的变化
lab1.pack(side=RIGHT)

pic = PhotoImage(file='personal.png')
pic_lab = Label(f1, image=pic)
pic_lab.pack(side=LEFT)

button1 = Button(f2, text='click me for more', command=fun1, padx=30)
button2 = Button(f2, text='close', command=back, padx=30)
button1.pack(side=LEFT)
button2.pack(side=RIGHT)
f1.pack(padx=10, pady=20)
f2.pack(padx=10, pady=20)

mainloop()

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

  • pad(x, y, z):设置三维距离

3、Radiobutton 组件用于实现单选按钮的效果,按钮之间是互斥的关系

from tkinter import *

tk1 = Tk()

lab1 = Label(tk1, text='What is your favorite letter?', justify=LEFT, padx=10)
lab1.pack(side=TOP)

choice = [('A', 1), ('B', 2), ('C', 3), ('D', 4)]
int_v = IntVar() # 处理整型数据
int_v.set(1)

for i, j in choice:
    radio_bt = Radiobutton(tk1, text=i, variable=int_v, value=j)
    radio_bt.pack(anchor=W)

mainloop()

在这里插入图片描述

事件处理

对于每个组件来说,都可以通过 bind() 方法将函数或方法绑定到到具体的事件上。当事件触发时,会调用 handler() 方法

使用 bind() 方法将具体的事件序列自定义的方法进行绑定。

事件序列使用字符串的形式来表示,包含在 <> 内,比如 <Button-1> 、<KeyPress-W>

from tkinter import *

tk1 = Tk()
def fun1(location): # 显示位置
    print('location clicked: ', location.x, location.y)
    
f1 = Frame(tk1, width=200, height=200)
f1.bind('<Button-1>', fun1)
f1.pack()

mainloop()

3、wxPython 框架

安装 wxPython

pip install wxPython

wxPython 程序

wxPython 程序至少需要包括一个应用对象 wx.App 和一个窗口对象 wx.Frame

wx.Frame(parent, id=-1, title='', size=wx.DefaultSize, pos=wx.Defaultposition, name='frame', style=wx.DEFAULT_FRAME_STYLE)

  • parant:框架的父窗口。如果是顶级窗口,则值为 None。
  • id:新窗口的 wxPython ID 号,默认为 -1, 表示让 wxPython 自动生成一个新的 ID
  • title:窗口的标题
  • size:用于指定窗口的初始尺寸((-1, -1) 表示让系统决定窗口的初始尺寸)
  • pos:指定窗口左上角的位置((0, 0) 表示左上角,默认 (-1, -1) 表示让系统决定窗口的位置
  • name:框架内在的名称,通过该参数可以找到窗口
  • style:指定窗口类型的常量,可以通过或运算进行组合
import wx

app = wx.App() # 应用程序对象
frame = wx.Frame(None, title='wxPython window', size=(400, 300), pos=(100, 100)) # 窗口对象
frame.Show() # 显示窗口
app.MainLoop()

在这里插入图片描述

常用控件

wxPython 的所有控件都继承自 wx.Control 类

1、文本控件

  • wx.StaticText 用于在窗口中显示文本
    wx.StaticText(parent, id, label, size=wx.DefaultSize, pos=wx.DefaultPosition, style=0, name='staticText')

    • parent:父窗口部件

    • id:标识符,-1 表示自动创建一个唯一的标识

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

    • size:窗口部件的大小

    • pos:窗口部件的位置

    • style:样式标记

    • name:对象的名字

  • wx.Panel() 创建画板

  • wx.Font() 设置字体

    • 数字表示字体的整体尺寸
    • wx.DEFAULT 使用系统默认的字体
    • wx.FONTSTYLE_NORMAL 字体正常
    • wx.NORMAL 字体的醒目程度正常
import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title='Appreciation of Tang Poetry', pos=(100, 100), size=(400, 300))
        panel = wx.Panel(self)
        title = wx.StaticText(panel, label='奉和中书舍人贾至早朝大明宫——岑参[唐]', pos=(80, 20))
        font = wx.Font(10, wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
        title.SetFont(font)

        wx.StaticText(panel, label='鸡鸣紫陌曙光寒,莺啭皇州春色阑。', pos=(100, 50))
        wx.StaticText(panel, label='金阙晓钟开万户,玉阶仙仗拥千官', pos=(100, 70))
        wx.StaticText(panel, label='花迎剑佩星初落,柳拂旌旗露未干。', pos=(100, 90))
        wx.StaticText(panel, label='独有凤凰池上客,阳春一曲和皆难。', pos=(100, 110))

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

在这里插入图片描述

  • wx.TextCtrl 接收用于输入的文本
    wx.TextCtrl(parent, id, value='', size=wx.DefaultSize, pos=wx.DefaultPosition, style=0, validator=wx.DefaultValidator, name = wx.TextCtrlNameStr)
    • value:显示在该控件中的初始文本
    • style:单行输入文本框的样式
    • validator:用于过滤数据
import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title='login', size=(400, 300))
        panel = wx.Panel(self)
        self.static_title = wx.StaticText(panel, label='user login page', pos=(140, 20))

        self.label_user = wx.StaticText(panel, label='username: ', pos=(50, 70))
        self.user_name = wx.TextCtrl(panel, pos=(120, 70), size=(220, 25), style=wx.TE_LEFT)

        self.label_pwd = wx.StaticText(panel, label='password: ', pos=(50, 110))
        self.pwd = wx.TextCtrl(panel, pos=(120, 110), size=(220, 25), style=wx.TE_PASSWORD)

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

在这里插入图片描述

2、按钮控件

wx.Button 控件用于生成一个按钮

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, title='login', size=(400, 300))
        panel = wx.Panel(self)
        self.static_title = wx.StaticText(panel, label='user login page', pos=(140, 20))

        self.label_user = wx.StaticText(panel, label='username: ', pos=(50, 70))
        self.user_name = wx.TextCtrl(panel, pos=(120, 70), size=(220, 25), style=wx.TE_LEFT)

        self.label_pwd = wx.StaticText(panel, label='password: ', pos=(50, 110))
        self.pwd = wx.TextCtrl(panel, pos=(120, 110), size=(220, 25), style=wx.TE_PASSWORD)

        # 按钮
        self.bt_confirm = wx.Button(panel, label='confirm', pos=(125, 160))
        self.bt_cancel = wx.Button(panel, label='cancel', pos=(215, 160))

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

在这里插入图片描述

布局管理

size 布局(尺寸布局器)可以随着界面调整而自动调整到合适的位置

  • BoxSizer:在水平或垂直线
  • GridSizer:基础的网格布局(适用于同样的尺寸且整齐放入)
  • FlexGridSizer:以 GridSizer 为基础,更好地适应不同尺寸的窗口部件
  • GridBagSizer:基于 GridSizer,可以随意放置
  • StaticBoxSizer:标准的 BoxSizer,附带有标题和环线

e.g.(BoxSizer):

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'login', size=(400, 300))
        panel = wx.Panel(self)

        self.bt_confirm = wx.Button(panel, label='confirm')
        self.bt_cancel = wx.Button(panel, label='cancel')

        self.title = wx.StaticText(panel, label='user login page')

        self.label_user = wx.StaticText(panel, label='username: ')
        self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)

        self.label_pwd = wx.StaticText(panel, label='password: ')
        self.text_pwd = 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_pwd, proportion=1, flag=wx.ALL, border=5)

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

Add() 方法将控件放置到尺寸器中:Add(control, proportion, flag, border)

  • control:表示需要添加的控件
  • proportion:控制窗口的总尺寸,相对其它窗口的比例,取 0、1、2
  • flag:使用 | 操作符可以指定对齐方式
  • border:控制控件的边距
事件处理
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title='require', size=(300, 200))
        panel = wx.Panel(parent=self)
        self.statictext = wx.StaticText(parent=panel, label='clicking button brings surprises', pos=(20, 20))
        b = wx.Button(parent=panel, label='click', pos=(100, 70))
        self.Bind(wx.EVT_BUTTON, self.on_click, b) # EVT_BUTTON 表示按钮单击事件
    def on_click(self, event):
        self.statictext.SetLabelText('Good Morning!')

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

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


原文地址:https://blog.csdn.net/kuiini/article/details/142501917

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!