文章目录
一、Python GUI编程(Tkinter)
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:
-
Tkinter: Tkinter是Python标准GUI工具包,包含在Python标准安装中。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
-
wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。
-
Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。
二、Tkinter 编程
创建一个GUI程序的流程
- 1、导入 Tkinter 模块
- 2、创建控件
- 3、把控件放上去
- 4、进入消息循环
三、初探
1.产生的错误
import tkinter
top = tkinter.Tk()
# 进入消息循环
top.mainloop()
# 问题:运行的时候,提示 AttributeError: module 'tkinter' has no attribute 'Tk'
# 原因:代码文件命名成tkinter.py了,换个名字即可
2.创建窗口
import tkinter
top = tkinter.Tk()
# 进入消息循环,若没有这条语句,不会弹出窗口
top.mainloop()
- 有添加mainloop() 运行结果为:
- 若没有进入消息循环的语句 mainloop(),则结果将会是:
- 当然上述的代码若输入到交互式解释器中,有无mainloop(),都将会显示窗口。
3.创建按钮
import tkinter
def if_clicked():
print("I was clicked!")
btn = tkinter.Button() #创建一个按钮
btn.pack() # 使用布局管理器(几何管理器)告诉Tkinter将按钮放哪
# tkinter.mainloop() # 进入消息循环,即可实现一个窗口上有一个按钮,但按钮上没有任何文字等
# 1.控件包含各种属性,我们可以使用它们来修改控件的外观和行为。
# 1)可像访问字典项一样访问属性,分别设置属性
btn['text'] = 'Click me!'
btn['command'] = if_clicked
# 2)使用方法config同时设置多个属性
btn.config(text='Click me!', command=if_clicked)
# 3)使用控件的构造函数来配置控件
tkinter.Button(text='Click me too!', command=if_clicked).pack()
tkinter.mainloop()
创建单行文本框——控件Entry
创建滚动的多行文本区域
- 方法一:可结合使用控件 Text 和 Scrollbar
- 方法二:使用 tkinter.scrolledtext
- 删除文本:使用ScrolledText对象的delete
- 添加文本:使用ScrolledText对象的insert方法
四、布局
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,Tkinter公开的几何管理类:Pack、Grid、Place
布局方法 | 描述 |
---|---|
pack() | 当程序向容器中添加组件时,这些组件会依次向后排列,排列方向既可是水平排列,也可是垂直排列。 |
grid() | 类似表格的排列方式,需要指定参数 row 和 column 来设置控件的位置,如果控件横跨多行或多列,可能要指定参数 rowspan 或 columnspan |
place() | 指定控件的 x和y坐标 以及 高度 和 宽度 ,自定义控件的位置 |
[ 注意 ] 为避免麻烦,在一个容器(如窗口)中应只使用一种布局管理器。
1. Pack的使用
import tkinter
# 对控件调用方法pack时,将把控件放在其父控件(主控件)中。
# 要指定主控件,可使用构造函数的第一个可选参数;如果没有指定,将把顶级主窗口用作主控件
# 1.不指定主控件(主控件默认为顶级主窗口)
tkinter.Label(text="I'm in the first window!").pack()
# 没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中。
for i in range(4):
tkinter.Button(text=i).pack()
# 要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM。
# tkinter.Button(text=i).pack(side=tkinter.LEFT)
#要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。
# tkinter.Button(text=i).pack(side=tkinter.LEFT, fill=tkinter.X)
#要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True。
# tkinter.Button(text=i).pack(side=tkinter.LEFT, expand=True)
# 2.指定主控件
second = tkinter.Toplevel() # Toplevel类表示除主窗口外的另一个顶级窗口
tkinter.Label(second, text="I'm in the second window!").pack() # Label: 文本标签
tkinter.mainloop()
1.1 pack(),不带参数时:
1.2 pack(fill=tkinter.X/tkinter.Y)
要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。
1.3 pack(side=xxx)
要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM。
- side=tkinter.LEFT
- side=tkinter.BOTTOM
1.4 pack(expand=True)
要让控件随父控件(这里是窗口)一起增大(即保持等距),可将参数expand设置为True。
- side=tkinter.LEFT, expand=True
1.5 关于pack的其他参数等的设置(参照help)
2. grid 和 pack 参见help
五、事件处理
事件处理:GUI工具包中用户触发事件执行的操作。
- 要发挥作用,程序可能需要响应某些事件,否则用户将无法与之交互
- 在Tkinter中,要给组件添加事件处理程序,常使用方法bind
Tkinter提供的事件处理机制:
- 方法 bind (通用)
- 要让控件对特定的事件进行处理,可对其调用方法bind,并指定事件的名称和要使用的函数。
- 要让控件对特定的事件进行处理,可对其调用方法bind,并指定事件的名称和要使用的函数。
- 属性 command (特殊)
- 通过设置属性command给按钮指定动作(action)
>>> from tkinter import *
>>> top = Tk()
>>> def callback(event):
... print(event.x, event.y)
...
>>> top.bind('<Button-1>', callback) # <Button-1>:鼠标左按钮(按钮1)单击事件的名称
'2905763224712callback' # 将左键单击事件关联到函数callback,每当用户在窗口top中单击时,都将调用这个函数,向函数callback传递一个event对象(event对象一般来说包含的属性随着事件类型而异,在这里鼠标单击事件,提供了x和y的坐标)
>>> 99 51 # 单击窗口的某个位置,打印出x和y的坐标
133 132
68 24
135 39
六、一个简单的文本编辑器
from tkinter import *
from tkinter.scrolledtext import ScrolledText
# 调用方法delete和insert时,需要使用合适的参数来指定文本的位置;
# 在这里,我们将使用'1.0'来指定第1行的第0个字符(即第一个字符前面),使用END来指定文本末尾,并使用INSERT来指定当前插入点。
def load():
if not(filename.get()):
print("filename 不能为空")
else:
with open(filename.get()) as file:
contents.delete('1.0', END)
contents.insert(INSERT, file.read())
def save():
if not(filename.get()):
print("filename 不能为空")
else:
with open(filename.get(), 'w') as file:
file.write(contents.get('1.0', END))
# 注意!!!不要忘记为contents.get()里面加入参数
top = Tk()
top.title("Simple Editor") # 设置窗口的标题
# 错误:top['text'] = 'Simple Editor' top.text = 'Simple Editor'
contents = ScrolledText()
# 滚动多行文本区域,side=BOTTOM,因为是放在窗口的底部,哪怕窗口变大,fill=BOTH——填满左右侧窗口之间的全区域 BOTTOM+BOTH——填满底部开始的左右两侧 expand加上后,即装满窗口的全区域
contents.pack(side=BOTTOM, expand=True, fill=BOTH)
filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)
Button(text='Open', command=load).pack(side=LEFT) # 不要加expand=True,fill=X,否则按钮会变大,不好看,只要filename变长就好
Button(text='Save', command=save).pack(side=LEFT)
mainloop()
- 若文件已存在,则保存的时候,直接替换全部内容
- 若文件不存在,则自动新建文件
最后,如果想了解更多tkinter,查询help:
[ 参考文档 ]
-
[挪]-Magnus-Lie-Hetland-Python基础教程(第3版)