Python教程 - Tkinter
用户与程序的交互
- CLI(Command Line Interface,命令行接口)
- GUI( Graphical User Interface,图形用户接口)
CLI
Command Line Interface,命令行接口,以一行文字作为输入,一般只能显示文字,例如windows自带的cmd
GUI
Graphical User Interface,图形用户接口,我们常用的window系统就有很多丰富的界面,包括窗口、按钮、文本显示,图片显示等等
python上的GUI库 -- Tkinter
Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。IDLE、turtle界面也是用 Tkinter 编写而成。
Tkinter窗体
Python自带的可编辑的GUI界面,是一个图像窗口。Tkinter是使用 python 进行窗口视窗设计的模块。
示例:
# 导入tkinter库
import tkinter
# 创建一个窗体
main = tkinter.Tk()
# 进入消息循环,让窗口可以不断刷新
main.mainloop()
设置窗体的属性
import tkinter
main = tkinter.Tk()
# 设置标题
main.title("My First Window")
# 设置大小(宽x高)
main.geometry("300x200")
main.mainloop()
Tkinter显示控件--Label
Label(标签)控件,是最简单的显示控件,可以显示一些文字
示例:
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main,text='First Label')
l.pack()
main.mainloop()
其中'l.pack()'表示将创建的Label控件l放到main布局中
设置Label的背景颜色
可在创建Label控件时指定bg属性为相应的背景颜色
示例:
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main,text='First Label',bg='red')
l.pack()
main.mainloop()
也可以通过config方式进行配置
Label可以设置以下属性
属性 | 说明 |
---|---|
bg | 背景颜色 |
fg | 前景颜色,即文字的颜色 |
text | 显示的文字 |
height | 控件的高度,Label中表示为一个字符高度的多少倍 |
width | 控件的宽度,Label中表示为一个字符宽度的多少倍 |
... | ... |
示例 |
import tkinter
main = tkinter.Tk()
l = tkinter.Label(main)
l.config(text='First Label')
l.config(bg='red')
l.pack()
main.mainloop()
Tkinter按钮控件 -- Button
Button(按钮)可以让用户点击
示例
b = tkinter.Button(main)
b.config(text='First Button')
b.pack()
同理,也可以设置config改变背景颜色等属性
b = tkinter.Button(main)
b.config(text='First Button')
b.config(bg='green')
b.pack()
按钮的点击事件处理
以上示例的按钮点击没有任何反应,因为我们还没有设置按钮的command属性,该属性表示点击按钮后会调用的函数。
因此我们需要先定义一个函数,例如
def btn_click():
print('Button Click')
然后,设置按钮的command属性为上面定义的btn_click函数
b.config(command=btn_click)
运行程序,点击按钮,观察IDLE输出,可以观察到,每次点击按钮,IDLE都会输出一句Button Click
我们也可以通过按钮的点击事件改变其他控件的属性,例如label控件的显示文字,只需要在btn_click
def btn_click():
print('Button Click')
l.config(text='changed')
运行程序,点击按钮就会改变label的显示文字了
完整代码为:
import tkinter
def btn_click():
print('Button Click')
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='First label')
l.config(bg='red')
l.config(fg='white')
l.config(height=5)
l.config(width=20)
l.pack()
b = tkinter.Button(main,text='Click me')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
Tkinter的输入框控件 -- Entry
Python Tkinter 文本框用来让用户输入一行文本字符串。
示例, 创建一个输入框
e = tkinter.Entry(main)
e.pack()
获取和设置输入框的文字
有了输入框,我们可以让用户输入文字。但是上面的程序还没有处理用户输入了什么。
我们通过按钮的事件来进行配合,label的文字改为提示语:“Input some text:”,button的文字改为“OK”,并在button_click函数中处理输入框entry里用户输入的文字
def btn_click():
print(e.get())
l.config(text=e.get())
这样我们在输入框entry输入文字后,点击OK按钮,会发现标签label的文字也会随之改变
我们也可以一开始在创建输入框entry的时候设置默认的文字
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
这样窗口创建时entry就会自动有默认的输入文字
完整代码如下:
import tkinter
def btn_click():
print(e.get())
l.config(text=e.get())
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
tkinter的消息提醒控件 -- massagebox
消息框,用于显示你应用程序的消息框,也就是我们平时看到的弹窗。
一个简单的提示框示例:
import tkinter.messagebox # 要使用messagebox先要导入模块
tkinter.messagebox.showinfo(title='tips', message='Hello!')
消息框messagebo一般在用户进行了某些操作之后处理信息时使用。
因此,经常会在按钮button的点击事件函数里使用。
例如,我们可以接着上面的例子,在用户点击button后,获取输入框entry的文字进行相应的提示:
import tkinter.messagebox
def btn_click():
tkinter.messagebox.showinfo(title='tips', message=e.get())
提示信息的几种形式
messagebox提示信息的几种形式:
tkinter.messagebox.showinfo(title='tips', message='hello') # 提示信息对话窗
tkinter.messagebox.showwarning(title='tips', message='warning') # 提出警告对话窗
tkinter.messagebox.showerror(title='tips', message='error!') # 提出错误对话窗
print(tkinter.messagebox.askquestion(title='tips', message='need some help?')) # 询问选择对话窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='tips', message='hello')) # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='tips', message='hello')) # return 'True', 'False'
对话框 | 示例 |
---|---|
showinfo提示信息对话框 | |
showwarning提示警告对话框 | |
showerror提示错误对话框 | |
askyesno选择对话框 |
我们可以根据判断用户的输入来进行不同形式的提示,例如判断输入是不是为“123456”
示例
import tkinter.messagebox
def btn_click():
if e.get() == '123456':
tkinter.messagebox.showinfo(title='tips', message='bingo')
else:
tkinter.messagebox.showerror(title='tips', message='error')
完整代码:
import tkinter
import tkinter.messagebox
def btn_click():
if e.get() == '123456':
tkinter.messagebox.showinfo(title='tips', message='bingo')
else:
tkinter.messagebox.showerror(title='tips', message='error')
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')
l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()
e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()
b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()
main.mainloop()
tkinter的列表框控件 -- Listbox
Listbox(列表框)组件用于显示一个选择列表。Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色。根据组件的配置,用户可以从列表中选择一个或多个选项。
创建和设置Listbox
创建一个Listbox,并放置到主窗口:
lbox = tkinter.Listbox(main)
lbox.pack()
此时创建的Listbox没有任何内容,需要往里面插入内容
例如插入fruits:
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
完整代码:
import tkinter
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
main.mainloop()
获取Listbox的选择内容
curselection():
返回一个元组,包含被选中的选项的序号(从 0 开始)
如果没有选中任何选项,返回一个空元组
get(first, last=None):
返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本
如果忽略 last 参数,表示返回 first 参数指定的选项的文本
例如,添加一个按钮获取Listbox选择的内容:
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
tkinter.messagebox.showinfo(message=lbox.get(i))
b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()
完整代码:
import tkinter
import tkinter.messagebox
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
tkinter.messagebox.showinfo(message=lbox.get(i))
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()
main.mainloop()
删除Listbox中的内容
delete(first, last=None):
删除参数 first 到 last 范围内(包含 first 和 last)的所有选项
如果忽略 last 参数,表示删除 first 参数指定的选项
例如在btn_click中将选择的内容用delete删除:
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
lbox.delete(i)
选择其中一个内容(例如banana),然后点击按钮,就可以发现选择的内容已被删除
完整代码:
import tkinter
import tkinter.messagebox
def btn_click():
sl = lbox.curselection()
for i in sl:
print(i)
lbox.delete(i)
main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')
lbox = tkinter.Listbox(main)
lbox.pack()
fruits = ['apple', 'banana', 'orange']
for f in fruits:
lbox.insert('end', f)
b = tkinter.Button(main, text='delete')
b.config(command=btn_click)
b.pack()
main.mainloop()
单选按钮RadioButton
RadioButton一般用于提供一组选项,让用户从多个选项中选择其中一个。
完整代码:
import tkinter
def rbtn_selected():
print('You select', v.get())
main = tkinter.Tk()
main.geometry("300x300")
v = tkinter.IntVar()
r1 = tkinter.Radiobutton(main, text='One', variable=v, value=1)
r1.config(command=rbtn_selected)
r1.pack()
r2 = tkinter.Radiobutton(main, text='Two', variable=v, value=2)
r2.config(command=rbtn_selected)
r2.pack()
r3 = tkinter.Radiobutton(main, text='Three', variable=v, value=3)
r3.config(command=rbtn_selected)
r3.pack()
main.mainloop()
勾选按钮CheckButton
CheckButton一般用于提供一组选项,让用户从其中选择多个。
完整代码
import tkinter
def cbtn_selected():
print('You select', v1.get(), v2.get())
main = tkinter.Tk()
main.geometry("300x300")
v1 = tkinter.IntVar()
v2 = tkinter.IntVar()
c1 = tkinter.Checkbutton(main, text='apple', variable=v1, onvalue=1, offvalue=0)
c1.config(command=cbtn_selected)
c1.pack()
c2 = tkinter.Checkbutton(main, text='banana', variable=v2, onvalue=1, offvalue=0)
c2.config(command=cbtn_selected)
c2.pack()
main.mainloop()
拖动条Scale
Scale一般用于提供一个范围内的数字选择,让用户可以拖动。
完整代码
import tkinter
def btn_click():
print('horizontal', s1.get())
print('vertical', s2.get())
main = tkinter.Tk()
main.geometry("300x300")
s1 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s1.config(orient=tkinter.HORIZONTAL)
s1.pack()
s2 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s2.config(orient=tkinter.VERTICAL)
s2.pack()
b = tkinter.Button(main, text='OK')
b.config(command=btn_click)
b.pack()
main.mainloop()