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()用来维持窗口始终可见。不使用的话窗口会一闪而过

结果显示

tkinter 镜像下载 tkinter版本_tkinter 镜像下载

按钮

对于一个大的程序而言,和用户进行交互式必不可少的,我们来看一下按钮的是怎样实现的。

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 镜像下载 tkinter版本_python_02


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

tkinter 镜像下载 tkinter版本_控件_03


我们先从构造函数__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()

tkinter 镜像下载 tkinter版本_python_04

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

tkinter 镜像下载 tkinter版本_Tkinter_05


和 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 镜像下载 tkinter版本_python_06


除此之外,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")

几个弹出框口如图

tkinter 镜像下载 tkinter版本_tkinter 镜像下载_07


**此外,这些对话框都有三个可选参数:

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 布局有以下这些参数可用:

tkinter 镜像下载 tkinter版本_python_08


grid()布局,十分推荐大家使用这种网格布局。考虑到大多数程序都是矩形,很容

易将它们划分为几个行和列组成的网格,然后根据行和列号将组件放置到网格中。

tkinter 镜像下载 tkinter版本_GUI_09


当大家使用网格布局时,只需指定两个参数行和列。Place 布局是最灵活的布局,使用坐标来放置控件位置。但是,不建议这样大家使

用 place 布局,因为如果使用这种布局 GUI 在不同的分辨率下,界面通常是不同的。

tkinter 镜像下载 tkinter版本_Tkinter_10

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 解释器静态链接