TKinter部件用法
- 组件及作用
- 快速创建
- Button
- Label
- Entry
- Listbox
- Radiobutton
- Scale
- filedialog
- Canvas
- Menu
- Frame
- messagebox
- pack
- grid
- place
- 总结
Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。
组件及作用
控件 | 描述 |
Button | 按钮控件;在程序中显示按钮。 |
Canvas | 画布控件;显示图形元素如线条或文本 |
Checkbutton | 多选框控件;用于在程序中提供多项选择框 |
Entry | 输入控件;用于显示简单的文本内容 |
Frame | 框架控件;在屏幕上显示一个矩形区域,多用来作为容器 |
Label | 标签控件;可以显示文本和位图 |
Listbox | 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户 |
Menubutton | 菜单按钮控件,用于显示菜单项。 |
Menu | 菜单控件;显示菜单栏,下拉菜单和弹出菜单 |
Message | 消息控件;用来显示多行文本,与label比较类似 |
Radiobutton | 单选按钮控件;显示一个单选的按钮状态 |
Scale | 范围控件;显示一个数值刻度,为输出限定范围的数字区间 |
Scrollbar | 滚动条控件,当内容超过可视化区域时使用,如列表框。. |
Text | 文本控件;用于显示多行文本 |
tkMessageBox | 用于显示你应用程序的消息框。 |
快速创建
以下展示一个最基本的窗口创建
import tkinter
root_window = tkinter.Tk()
root_window.mainloop()
Button
Tkinter 按钮组件用于在 Python 应用程序中添加按钮,按钮上可以放上文本或图像,按钮可用于监听用户行为,能够与一个 Python 函数关联,当按钮被按下时,自动调用该函数。
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title("first gui") # 窗口名称
root.geometry("500x300+100+200")# 建立窗口的大小及位置
btn01 = Button(root)
btn01["text"] = "hello world"
btn01.pack()
def hello(e):
messagebox.showinfo('Message', 'give you a flower!')
print("hello world")
btn01.bind("<Button-1>", hello)
root.mainloop()
运行之后如图所示:
点击按钮之后:
会弹出一个消息窗口。
Label
Python Tkinter 标签控件(Label)指定的窗口中显示的文本和图像。
标签控件(Label)指定的窗口中显示的文本和图像。
你如果需要显示一行或多行文本且不允许用户修改,你可以使用 Label 组件。
import tkinter as tk
window = tk.Tk()
window.title('my window') # 窗口名称
window.geometry('200x100') # 窗口大小
var = tk.StringVar()
label01 = tk.Label(window, textvariable=var, bg='green', font=('Arial', 12), width=15,height=2)# 调用组件
label01.pack()
on_hit = False
def hit_me():
global on_hit
if on_hit ==False:
on_hit = True
var.set('you hit me')
else:
on_hit = False
var.set('')
button01 = tk.Button(window, text='hit me', width=15,
height=2, command=hit_me)
button01.pack() # 将小部件放置到主窗口中
# 进入消息循环
window.mainloop()
运行程序得到:
点击按钮之后:
Entry
Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看到。
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
def insert_point():
var = entry01.get()
text01.insert('insert', var)
def insert_end():
var = entry01.get()
text01.insert('end', var)
# text01.insert('2.2', var)
entry01 = tk.Entry(window, show=None)
entry01.pack()
button01 = tk.Button(window, text='insert point', width=15,
height=2, command=insert_point)
button01.pack()
button02 = tk.Button(window, text='insert end', width=15,
height=2, command=insert_end)
button02.pack()
text01 = tk.Text(window, height=4)
text01.pack()
window.mainloop()
运行之后,可以在上方输入,下方显示,可以通过按钮在下方插入:
Listbox
列表框控件,在Listbox窗口小部件是用来显示一个字符串列表给用户,可以供用户选择。
import tkinter as tk
window = tk.Tk()
window.title('window')
window.geometry('200x300')
var1 = tk.StringVar()
def print_selection():
value = listbox01.get(listbox01.curselection())
var1.set(value)
label01 = tk.Label(window, bg='yellow', width=10, textvariable=var1)
label01.pack()
button01 = tk.Button(window, text='click me', bg='red', width=10, height=2, command=print_selection)
button01.pack()
var2 = tk.StringVar()
var2.set((11,22,33,44))
listbox01 = tk.Listbox(window, listvariable=var2)
list_items = [1,2,3,4]
for item in list_items:
listbox01.insert('end', item)
listbox01.pack()
listbox01.insert(1, 'first')
listbox01.delete(2)
window.mainloop()
运行图片:
Radiobutton
Radiobutton为单选按钮,即在同一组内只能有一个按钮被选中,每当选中组内的一个按钮时,其它的按钮自动改为非选中态,与其他控件不同的是:它有组的概念
import tkinter as tk
window = tk.Tk()
window.title('qq')
window.geometry('200x400')
var = tk.StringVar()
label01 = tk.Label(window, bg='yellow', width=20)
label01.pack()
def print_selection():
label01.config(text='you have selected: ' + var.get())
r1 = tk.Radiobutton(window, text='Option A', variable = var,
value = 'A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='Option B', variable = var,
value = 'B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='Option C', variable = var,
value = 'C', command=print_selection)
r3.pack()
window.mainloop()
运行截图:
Scale
Scale控件允许用户通过移动滑动条来选择数值。你可以设置最小值和最大值,滚动的滑条取值在最大值和最小值之间。你可以使用Scale插件来取代Entry,特别是你需要用户输入一个特定范围内的值的时候。
创建一个在指定范围内的滑动条,需要给Scale类传入from和to选项。因为from是Python里面的关键字,所以你需要给from加上一个后置的下划线,即from_。
import tkinter as tk
window = tk.Tk()
window.title('window')
window.geometry('400x200')
label01 = tk.Label(window, width = 25, text='en', bg='yellow')
label01.pack()
def print_selection(v):
label01.config(text='you have selected:' + v)
scale01 = tk.Scale(window, label='try me', from_=5, to=10, orient=tk.HORIZONTAL,
length=200, showvalue=1, tickinterval=1, resolution=0.01, command=print_selection)
scale01.pack()
window.mainloop()
演示截图:
filedialog
可以实现打开文件夹的操作,更加的简洁高效。
tkinter.filedialog.asksaveasfilename() # 选择以什么文件名保存,返回文件名
tkinter.filedialog.askopenfilename() # 选择打开什么文件,返回文件名
示例代码:
from tkinter import *
import tkinter.filedialog
def xz():
filename=tkinter.filedialog.askopenfilename()
if filename != '':
lb.config(text='您选择的文件是'+filename)
else:
lb.config(text='您没有选择任何文件')
root = Tk()
lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出文件选择对话框',command=xz)
btn.pack()
root.mainloop()
效果:
Canvas
Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。
可以显示图片,但是只能是gif格式,或者利用:
from PIL import Image,ImageTk
import tkinter as tk
window = tk.Tk()
window.title('qq')
window.geometry('300x300')
def moveit():
canvas.move(image,1,2)
canvas = tk.Canvas(window, bg='blue', height=200, width=200)
image_file = tk.PhotoImage(file='gan.gif') # 显示图片
image = canvas.create_image(0, 0, anchor='nw', image=image_file)
x0,y0,x1,y1=50,50,80,80
line = canvas.create_line(x0,y0,x1,y1) # 画直线
oval = canvas.create_oval(x0,y0,x1,y1,fill='red') # 画圆
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180) # 画圆胡
rect = canvas.create_rectangle(100,30,120,50) # 画长方形
canvas.pack()
button = tk.Button(window, text='move', command=moveit)
button.pack()
window.mainloop()
样式如下:
Menu
Menu(菜单)组件用于实现顶级菜单、下拉菜单和弹出菜单。
- 顶层菜单(Toplevel)
这种菜单是直接位于标题下面的固定菜单。 - 下拉菜单(pulldown)
当一个菜单有多个功能或者多个选择时,比如我们使用wps 文字处理软件,其中的文件菜单就有很多的功能,“打开文件”,“关闭文件”等等。窗口的大小是有限的,不能把所有的菜单项都做成顶层菜单,这个时候就需要下拉菜单。 - 弹出菜单(popmenu)
弹出的菜单,最常见是使用点击右键,在鼠标位置处弹出一个菜单。
import tkinter as tk
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
global counter
counter=0
label1 = tk.Label(window, text='', bg='yellow')
label1.pack()
def do_job():
global counter
label1.config(text='do'+str(counter))
counter+=1
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='file', menu=filemenu)
filemenu.add_command(label='new', command=do_job)
filemenu.add_command(label='open', command=do_job)
filemenu.add_command(label='save', command=do_job)
filemenu.add_separator()
filemenu.add_command(label='exit', command=window.quit)
editmenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='edit', menu=editmenu)
editmenu.add_command(label='cut', command=do_job)
editmenu.add_command(label='copy', command=do_job)
editmenu.add_command(label='paste', command=do_job)
submenu = tk.Menu(filemenu)
filemenu.add_cascade(label='import', menu=submenu)
submenu.add_command(label='submenu1', command=do_job)
window.config(menu=menubar)
window.mainloop()
示例:
除了这两个之外,还有很多下拉菜单,没办法截图。
Frame
Frame(框架)组件是在屏幕上的一个矩形区域。Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充。
import tkinter as tk
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
tk.Label(window, text='on the window').pack()
frm = tk.Frame(window)
frm.pack()
frm_l = tk.Frame(frm)
frm_r = tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
tk.Label(frm_l, text='on the frm_l1').pack()
tk.Label(frm_l, text='on the frm_l2').pack()
tk.Label(frm_r, text='on the frm_r1').pack()
window.mainloop()
运行得到:
messagebox
tkMessageBox是Tkinter中常用的对话框控件,可以和方便实现相关对话框的弹出等,类似于MFC中的MessageBox。在Tkinter中定义了多种类型的对话框,其基本的调用形式为:
tkMessageBox.xxxxx(title, message, options)
示例:
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
def hit_me():
messagebox.showinfo(title='Hi', message='hahaha')
# messagebox.showwarning(title='Hi', message='something wrong')
# messagebox.showerror(title='Hi', message='NO')
# print(messagebox.askquestion(title='Hi', message='?')) # return 'yes' 'no'
# print(messagebox.askyesno(title='Hi', message='?')) # return 'True' "Flase"
# print(messagebox.askretrycancel(title='Hi', message='?'))
# print(messagebox.askokcancel(title='Hi', message='?'))
tk.Button(window, text='hit me', command=hit_me).pack()
window.mainloop()
得到:
其余的可以去掉注释,一一尝试。
pack
- pack函数布局的时候,默认先使用的放到上面,然后依次向下排列,默认方式它会给我们的组件一个自认为合适的位置和大小。
- pack函数也可以接受几个参数,side参数,指定了它停靠在哪个方向,可以为LEFT,TOP,RIGHT,BOTTOM,分别代表左,上,右,下,
它的fill参数可以是X,Y,BOTH,NONE即在水平方向填充,竖直方向填充,水平和竖直方向填充和不填充。 - 它的expand参数可以是YES 和 NO,它的anchor参数可以是N,E,S,W(这里的NESW分别表示北东南西,这里分别表示上右下左)以及他们的组合或者是CENTER(表示中间)
- 它的ipadx表示的是内边距的x方向,它的ipady表示的是内边距的y的方向,padx表示的是外边距的x方向,pady表示的是外边距的y方向
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
tk.Label(window, text=1).pack(side='top')
tk.Label(window, text=1).pack(side='bottom')
tk.Label(window, text=1).pack(side='left')
tk.Label(window, text=1).pack(side='right')
window.mainloop()
示例:
grid
Grid(网格)布局管理器会将控件放置到一个二维的表格里。主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。
grid管理器是Tkinter里面最灵活的几何管理布局器。如果你不确定什么情况下从三种布局管理中选择,你至少要保证自己会使用grid。
当你设计对话框的时候,grid布局管理器是一个非常方便的工具。如果你之前使用pack进行布局的话,你会被使用grid后的简洁而震惊。与适应很多frame来让pack工作不同,在大多数情况下,你只需要将所有控件放置到容器中,然后使用grid将它们布局到任何你想要布局的地方。
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
for i in range(4):
for j in range(3):
tk.Label(window, text=1).grid(row=i,column=j,ipadx=10,ipady=10)
window.mainloop()
示例:
place
将容器如何放置在你的窗口上面,主要是将容器按照绝对坐标系进行放置,如果需要精确按照坐标放置,那place一定是首选。
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title('qq')
window.geometry('200x200')
tk.Label(window,text=1).place(x=10,y=100,anchor='nw')
tk.Label(window,text=2).place(x=10,y=100,anchor='se')
window.mainloop()
示例:
总结
Tkinter是一个简单的python GUI设计库,使用方便简单,但是功能有限,功能较多的可以用QT。
以上的示例只是简答的介绍了控件的一些简单使用,所以具体的想要了解的还是需要去查阅相应的组件的介绍文档。