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

运行之后如图所示:

tkinter项目架构 tkinter组件详解_python


点击按钮之后:

tkinter项目架构 tkinter组件详解_tkinter_02


会弹出一个消息窗口。

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

运行程序得到:

tkinter项目架构 tkinter组件详解_教程_03


点击按钮之后:

tkinter项目架构 tkinter组件详解_python_04

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

运行之后,可以在上方输入,下方显示,可以通过按钮在下方插入:

tkinter项目架构 tkinter组件详解_tkinter_05

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

运行图片:

tkinter项目架构 tkinter组件详解_教程_06

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

运行截图:

tkinter项目架构 tkinter组件详解_python_07

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

演示截图:

tkinter项目架构 tkinter组件详解_tkinter项目架构_08

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

效果:

tkinter项目架构 tkinter组件详解_python_09


tkinter项目架构 tkinter组件详解_python_10


tkinter项目架构 tkinter组件详解_gui_11

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

样式如下:

tkinter项目架构 tkinter组件详解_python_12


tkinter项目架构 tkinter组件详解_tkinter_13

Menu

Menu(菜单)组件用于实现顶级菜单、下拉菜单和弹出菜单。

  1. 顶层菜单(Toplevel)
    这种菜单是直接位于标题下面的固定菜单。
  2. 下拉菜单(pulldown)
    当一个菜单有多个功能或者多个选择时,比如我们使用wps 文字处理软件,其中的文件菜单就有很多的功能,“打开文件”,“关闭文件”等等。窗口的大小是有限的,不能把所有的菜单项都做成顶层菜单,这个时候就需要下拉菜单。
  3. 弹出菜单(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()

示例:

除了这两个之外,还有很多下拉菜单,没办法截图。

tkinter项目架构 tkinter组件详解_tkinter项目架构_14

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

运行得到:

tkinter项目架构 tkinter组件详解_gui_15

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

得到:

其余的可以去掉注释,一一尝试。

tkinter项目架构 tkinter组件详解_python_16

pack

  1. pack函数布局的时候,默认先使用的放到上面,然后依次向下排列,默认方式它会给我们的组件一个自认为合适的位置和大小。
  2. pack函数也可以接受几个参数,side参数,指定了它停靠在哪个方向,可以为LEFT,TOP,RIGHT,BOTTOM,分别代表左,上,右,下,
    它的fill参数可以是X,Y,BOTH,NONE即在水平方向填充,竖直方向填充,水平和竖直方向填充和不填充。
  3. 它的expand参数可以是YES 和 NO,它的anchor参数可以是N,E,S,W(这里的NESW分别表示北东南西,这里分别表示上右下左)以及他们的组合或者是CENTER(表示中间)
  4. 它的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()

示例:

tkinter项目架构 tkinter组件详解_tkinter项目架构_17

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

示例:

tkinter项目架构 tkinter组件详解_python_18

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项目架构 tkinter组件详解_教程_19

总结

Tkinter是一个简单的python GUI设计库,使用方便简单,但是功能有限,功能较多的可以用QT。
以上的示例只是简答的介绍了控件的一些简单使用,所以具体的想要了解的还是需要去查阅相应的组件的介绍文档。