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