tkinter
Tkinter 库,或者说“Tk 接口”,是 Tk GUI 工具包的标准 Python 接口。Tk 和 tkinter 都可
以在大多数 Unix 平台以及 Windows 系统上使用。(Tk 本身不是 Python 的一部分;它维持在ActiveState,Tk 工具最初是为 tcl 设计的。)Tk+interface=tkinter
Python 提供的 IDLE 就是使用 tkinter 设置出来的
创建界面
在 Python3.2 之后的版本,tkinter 库已经被内置到 python 当中了
但如果读者比较巧合的使用 3.x 版本的 Python 同是又在版本号又在 3.2 以下的话,那么读者需要通过 pip 来安装 tkinter
pip install tkinter
当想要使用的时候,可以直接导入 tkinter 库。
import tkinter
tkinter._test()
如果读者使用过的是 2.x 的 Python,那么你需要将 t 换成 T:
import tkinter as tk
# 实例化对象
root = tk.Tk()
# 设置标题
root.title('this is a GUI 界面')
# 创建Lable 标签
text = tk.Label(root, text='a simple tkinter GUI')
# 将文字居中
text.pack()
# 程序循环
root.mainloop() # mainloop()用来维持窗口始终可见。不使用的话窗口会一闪而过
结果显示
按钮
对于一个大的程序而言,和用户进行交互式必不可少的,我们来看一下按钮的是怎样实现的。
import tkinter as tk
#实例化对象
root=tk.Tk()
#设置标题
root.title('Button Tkinter ——按钮')
def hello_world():
print('Hello world')
# 创建按钮并居中
button = tk.Button(root, text='this is a button', fg='blue', command=hello_world)
button.pack()
root.mainloop()
tkinter 大部分控件的参数都基本上是相同的,比如说,我们刚才实现的 Lable 和Button 控件实际上只有一个 command 参数的不同。
pack 属性
pack()中可以设置位置,设置参数 side=tk.LEFT,方位一共有四个,分别是 tk.RIGHT,
tk.TOP,tk.bottom,如果不想要让控件直接靠边,还可以设置距离上下,左右边框的距离,padx,pady 用于设置距离,x 表示的是距离左右边框的距离,而 y 表示的是距离上下边框的距离。
button=tk.Button(root,text="i'm a button",fg="blue",command=hello_world)
button.pack(side=tk.LEFT,padx=10,pady=10)
pack 还有另外一种设置控件位置的方式,可以使用 anchor 方式,使用 anchor 方式
NSEW(北,南,东,西的缩写)分别对应上下左右以及 CENTER 对应中间方位,注意,读者需求使用的是大写字母
checkbutton=Checkbutton(root,text=i,variable=variable[-1])
checkbutton.pack(anchor=W)
此外,如果还可以在 pack 中设置填充,这里填充的是 X 轴和 Y 轴,分别对应横向和纵向,X 和 Y 同样需要大写,并且 fill 属性仅仅在部分控件中可以使用
checkbutton=Radiobutton(root,text=i,variable=variable,value=counter,indicatoron=False)
checkbutton.pack(fill=X)
expand 属性表示的是我们是否扩展到空白位置,当值为“yes”时,side 选项无效。控件
显示在该控件的 master 控件的中心;如果 fill 选项是“both”,则填充 master 控件的剩余空白部分。
继承类
我们用一种复杂的类的继承的方法来实现在本章最开始的输出 hello_world 的窗口和按扭
# 导入库
import tkinter as tk
# 继承类
class Application(tk.Frame):
# 构造函数
def __init__(self, master=None):
# 调用父类
super().__init__(master)
# 调整大小和位置
self.pack()
# 调用后面的内容
self.create_widgets()
# 创建窗口
def create_widgets(self):
# say_hello 按钮
self.say_hello = tk.Button(self, text="click me to say\nHello World",command=self.say_hello)
self.say_hello.pack(side="top")
# 退出按钮
self.quit = tk.Button(self, text="退出", fg="blue", command=root.destroy)
self.quit.pack(side="bottom")
# 构造功能函数
def say_hello(self):
print("hello_world")
# 实例化对象
root = tk.Tk()
# 设置标题
root.title("继承")
# 类的继承
app = Application(master=root)
# 程序循环
app.mainloop()
我们先从构造函数__init__看起,super()函数是用于调用父类(超类)的一个方法,self,指的是 Application 对象本身,master 指的是从属关系,在 tkinter 中,如果一个控件从属于另一个控件,比如说,在 Label 在某个 Frame 中,这时候 Frame 是 Label 的 master,但我们创建的是顶级窗口,它是没有从属关系的,所以我们默认 master=None
super().__init__(maste
这一行代码调用我们创建的类 Application 的父类 Frame 的__init__函数初始化Application 类中的 Frame 类部分
self.create_widgets()
此代码用于调用后面定义的 createWidgets 方法
self.say_hello=tk.Button(self,text="click me to say\nHello World",command=self.say_h
这行代码也可以这样分开写,分开书写的优点在于格式整齐且对称,比较方便后期代码的维护:
self.say_hello=tk.Button(self)
self.say_hello["text"]="Hello World\n(click me)"
self.say_hello["command"]=self.say_hi
我们使用这一行代码来实现退出按钮,root.destroy 可以用来关闭界面。
self.quit=tk.Button(self, text="退出", fg="blue",command=root.destro
Checkbutton 和 Radiobutton 多选框和复选框的实现
#实现选项,变量值取变量列表中的最后一个
checkbutton=Checkbutton(root,text=i,variable=variable[-1])
#创建单选框并居中
checkbutton=Radiobutton(root,text=i,variable=variable,value=counte
#将圆点改成类似于 button 类型的单选框
checkbutton=Radiobutton(root,text=i,variable=variable,value=counter,indicatoron=False)
Entry 输入框
from tkinter import *
#创建主窗口和标题
root=Tk()
root.title("输入")
#创建控件框架
labelframe1= LabelFrame(root,text ="登录框",padx = 5,pady = 5)
labelframe1.pack(padx = 10,pady = 10)
#输入框前面的文字部分
Label1=Label(labelframe1,text="账号")
#使用 grid()方式进行布局
Label1.grid(row=0,column=0,padx=5,pady=5)
Label2=Label(labelframe1,text="密码")
Label2.grid(row=1,column=0,padx=5,pady=5)
#账户和密码输入框
entry1=Entry(labelframe1)
#使用 grid()方式进行布局
entry1.grid(row=0,column=1,padx=5,pady=5)
entry2=Entry(labelframe1)
entry2.grid(row=1,column=1,padx=5,pady=5)
#窗体循环
mainloop()
Text 控件
Text 控件最初的目的是用于显示和处理多行文本,但其丰富的功能,导致现在大多被
用作文本编辑器,Python 编程语言附带的 IDLE 编辑器主体部分就是采用 Text 控件实现
在这里使用 Text 控件并在其中插入一张图片,是的,Text 控件也可以用于显示图
片!
#导入库
from tkinter import *
#创建主窗口和标题
root=Tk()
root.title("Text Image")
#创建 Text 控件
text=Text(root,width=36,height=25)
text.pack()
#创建并插入图片
photo=PhotoImage(file="logo.png")
text.image_create(END,image=photo)
#窗体循环
mainloop()
和 Entry 控件类似,Text 控件也有 get()方法
#获取字符
get_text=text.get("1.0","1.end")
#换行
text.insert(END,"\n")
#插入
text.insert(END,get_text)
Canvas 控件
Canvas 为 Tkinter 提供了绘图功能。它提供包括线条、圆圈、图像在内的众多图形组
件。在这里,我们使用 convas 控件来实现一个简单的手写触摸板
#Text 控件
canvas=Canvas(root,width=500,height=300)
canvas.pack()
#两点坐标构造圆
def track(motion):
x1=motion.x-0.1
x2=motion.x+0.1
y1=motion.y-0.1
y2=motion.y+0.1
canvas.create_oval(x1,y1,x2,y2,fill="black")
#事件绑定
canvas.bind("<B1-Motion>",track)
Menu 控件
#顶级菜单
menubar=Menu(root)
#menu1 是菜单栏
menu1=Menu(menubar,tearoff=0)
menu1.add_command(label="新建文件",command=action)
menu1.add_command(label="打开文件",command=action)
menu1.add_command(label="打开文件夹",command=action)
menubar.add_cascade(label="菜单",menu=menu1)
除此之外,tkinter 还提供了一个 OptionMenu,实现下拉单选框
#定义变量
variable=StringVar()
#设置默认值
variable.set("test1")
optionmenu=OptionMenu(root,variable,"test1","test2","test3")
optionmenu.grid(row=0,column=0)
spinbox 控件
Tk8.4 添加了 spinbox 控件,与之相应的 Python 版本是 Python3.2,也就是说,Spinbox
只支持 Python3.2 和 Tk8.4 以上的版本。
Spinbox 控件和 Entry 大致上相同,,如果读者不在其中加入 values 参数的话,几乎可
以当做 Entry 组件来使用,但 Spinbox 控件可以限制用户从一些固定的值中选择一个
#选项
option=["test1","test2","test3","test4"]
#创建窗体
spinbox=Spinbox(root,values=option)
spinbox.pack()
messagebox
按照代码的顺序,将这些内容弹出来对话框罗列出来,askokcancel()和
askyesno(),askquestion()在中文状态下弹出的对话框样式是相同的,因此只罗列一个
#导入库
from tkinter.messagebox import *
askokcancel("title","content")
askyesno("title","content")
askquestion("title","content")
askretrycancel("title","content")
showerror("title","content")
showinfo("title","content")
showwarning("title","content")
几个弹出框口如图
**此外,这些对话框都有三个可选参数:
icon,修改图标,只能指定 error,info,question,warning 中的一个,不能使用自定
义图标,下面这一行确认框将显示错误框的图标
askokcancel("title","content",icon="error")
default,设置默认的按钮,也就是说回车会选中的按钮,必须是 abort,retry,ignore,ok,cancel,no,yes 中的一个,不能自定义。下面这一行代码的默认值是取消,按下回车键后返回的值是 0:
askokcancel("title","content",default="cancel")
parent,将对话框显示在指定的子窗口上,下面这一行代码将弹出的窗口显示在子窗口 sub 上。
askokcancel("title","content",parent="sub ")**
Message
Message 控件和 Label 控件在大体上是相似的,使用方法和参数也几乎一模一杨,但
message 控件使用起来更加舒服和得心应手,因为其能够自动换行,并调整文本的尺寸使其适应给定的尺寸
tkinter 界面布局
所谓布局,指的是对顶级窗口中每个控件(组件)位置的控制。Tkinter 有三个几何布局
管理器:pack、grid 和 place
pack 布局,首先将控件添加到顶级窗口中,首先在顶部,然后向下。
pack 布局有以下这些参数可用:
grid()布局,十分推荐大家使用这种网格布局。考虑到大多数程序都是矩形,很容
易将它们划分为几个行和列组成的网格,然后根据行和列号将组件放置到网格中。
当大家使用网格布局时,只需指定两个参数行和列。Place 布局是最灵活的布局,使用坐标来放置控件位置。但是,不建议这样大家使
用 place 布局,因为如果使用这种布局 GUI 在不同的分辨率下,界面通常是不同的。
tkinter 支持的模块
tkinter 的功能强大不仅仅在于它可以绘制出窗口,更在于它包含的小控件的丰富性,
以下这些内容都可以在 tkinter 中使用:
❑ tkinter.scrolledtext,内置垂直滚动条的文本小部件。
❑ tkinter.colorchooser,用于让用户选择颜色的对话框。
❑ tkinter.commondialog,此处列出的其他模块中定义的对话框的基类。
❑ tkinter.font,用于帮助处理字体的实用程序。
❑ tkinter.messagebox,实现标准 Tk 对话框。
❑ tkinter.simpledialog,基本对话框和一些其他的便利功能。
❑ tkinter.dnd,拖放支持
❑ turtle,实现简单的绘图功能
tkinter 接口
tkinter 提供了 Button,Canvas,Label,Text,Frame 等一系列组件,大多数时候,这些组件足够我们编写一个较为完善的 GUI 程序了,但是也有一些额外的模块可用,这些接口位于一个名为_tkinter 的二进制模块中。这个模块包含 Tk 的低级接口,开发者一般是无法直接使用它的,它通常是一个共享库(或 DLL),但在某些情况下可能会与 Python 解释器静态链接