说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 标准库 tkinter 可以满足基本的用户界面绘制,让你写的程序有一个用户友好的界面。Tcl/Tk 集成到 Python 中已经有一些年头了。Python程序员可以通过 tkinter 包和它的扩展, tkinter.tix 模块和 tkinter.ttk 模块,来使用这套鲁棒的、跨平台的窗口工具集。
一些最为常用的方法:
import tkinter as tk
# 定义一个新的窗体
win = tk.Tk()
# 窗体的标题
win.title('Griruo GUI')
# 默认窗体大小 widthxheight+x+y
win.geometry('300x300+300+300')
# 窗体可最大化最小化大小值
win.minsize(width=300, height=300)
win.maxsize(width=800, height=400)
# 是否可调整宽度或高度
win.resizable(width=True, height=False)
# 窗口 icon
win.iconbitmap('path/myicon.ico')
# 窗口配置: 背景颜色
win.config(background='#cccccc')
# 属性配置
win.attributes('-alpha', 0.9) # 透明度
win.attributes('-topmost', 1) # 永远在最新端
def click():
text = en.get()
lb.config(text=text)
# 按钮部件
btn = tk.Button(text='点我!') # 定义一个按钮
btn.config(background='skyblue')
btn.config(width=10, height=5)
btn.config(pady=1)
# btn.config(command=lambda: print('hello!'))
btn.config(command=click)
btn.pack() # 打包到父部件
# Entry 输入部件
en = tk.Entry()
en.config(bg='yellow')
en.pack()
# label 标签部件
lb = tk.Label(text='这是一个 label')
lb.config(bg='#666666')
lb.pack()
# 运行窗口
win.mainloop()
所谓控件,就是 GUI 图形化界面上的对象,或者说功能元素。比如输入框、文本框、按钮、下拉菜单、滚动条等等,窗体本身也可以认为是一个控件。一个控件包含了数据和操作,决定了页面上的元素放在哪里、长什么样、有什么样的效果。主要有:
等,有 15 个核心控件,每个有非常多的参数,可看文档了解。
其他控件有:
控件属性的设置 3 种方法:
通过 pack() 方法把它们添加到了窗口之上。
注:tkinter 存在如下问题
部件的位置排列,有三种方式:
pack() 可以将控制包装在界面的指定位置上,如果只是简单的用 pack() 方法将控件添加到窗口上,它们将按顺序从上往下的放置。
btn.pack() # defaults to side = "top"
btn.pack(side="left")
btn.pack(expand=1)
btn.pack(fill=tk.X, padx=5, pady=20, side=tk.LEFT)
利用上述参数可以调整放置的边距、填充方式、对齐方式等。
place 可以精确地指定空间的放置坐标及长宽。
btn.place(x=50, y=100, width=120, height=25)
Grid 将窗口像表格一样划分成不同的格子,将控件放置进去。
# 第 2 行,第 1 列
btn.grid(row=1, column=0)
当用户做了一个操作,程序要做出怎样的反应。事件要与特定的控件相绑定,比如按钮有点击事件,输入框有按键事件,窗体有关闭事件等。
有两种绑定方法:
在控件属性设置中的 command 参数中指定响应函数:
def on_click():
print('点我干什么!')
# command 指定函数对象
btn = Button(root, text='别点我', command=on_click)
在函数中可以对所有的控件做操作(设置属性的方法)。
通过 bind 方法对控制对象绑定不同的事件:
def onButton(event):
print("Clicked:", event.x, event.y)
def onKey(event):
print("Pressed", event.char)
en = tk.Entry()
en.bind('<Button-1>', onButton) # 按钮
en.bind('<Key>', onKey) # 按键事件
相关功能部件还有:
如,选择文件对话框及返回:
from tkinter import filedialog
text = tk.StringVar() # 定义一个转入框接入变量
en = tk.Entry(bd =2,width=25 ,textvariable=text) # 传递到数据框
filename = filedialog.askdirectory() # 选择文件
text.set(filename) # 设置到变量
text.get() # 读取值
todo
todo:
在 tkinter 中,根窗口只能有一个,也就是通过 Tk() 方法创建的实例对象。如果需要创建多个窗口该怎么办呢? 那就需要使用另一个控件 —— Toplevel。
root.mainloop() 是什么意思呢?我们的 GUI 程序其实和动画电影原理差不多,是一个个静态画布快速切换组成,这样人看起来在动(当然看起来不动的时候也在动)。鼠标的移动,键盘的按键等都是实实在在输入。这些都可以叫做事件,如鼠标移动事件,双击事件,按下 ESC 事件。假如你勾选了一个复选框,在未选中和选中的一刹那间画面进行了切换,这个切换的动力就是 mainloop() 方法。它能对这些所有的事件进行实时监听捕获。各种组件的 pack() 方法就是将部件的类型,尺寸,样式,位置,然后绑定一个事件。
简单说,GUI 编程都有一个主体的死循环,一旦退出这个死循环,程序就结束了,mainloop 就可以理解为这样一个循环。电脑屏幕也是如此,是不停在刷新的。一般是 50-60hz 每秒。游戏也有一个帧率 fps,就是画面的刷新频率,太慢会显得画面卡顿。屏幕还有局部刷新的技术,不一定每次都刷新整块屏幕,有些程序设计也是,可以所有组件每次事件都重新绘制刷新,也可以只是刷新需要刷新的部分。
关于 GUI 的更多原理,可以查阅相关的文章学习。
可使用三方库 pyinstaller(https://pyinstaller.readthedocs.io/en/stable/) 打包生成 exe 文件供 windows 系统执行。
# 安装
pip install pyinstaller
# 运行命令
pyinstaller --onefile --noconsole --name your_script.py
三方库 py2app 能将文件打包成一个 macOS 标准软件:
pip3 install py2app # 命令进行安装py2app工具
cd xxx # 进入到main.py文件所在的目录(可选)
py2applet --make-setup main.py # 创建一个setup.py的打包脚本文件
python3 setup.py py2app -A # 运行打包脚本,生成app文件
todo:
更新时间:2022-02-19 13:23:07 标签:python 界面 gui tkinter