Tkinter入门和常用组件

TOC

Tkinter的入门使用

Tkinter是Python中的内置库,无须再次安装模块。Tkinter是一个标准的GUI(图形用户见面)库,相对其他库会比较轻量,易用并且功能强大。我们能够使用这个库快速写出只管、交互式的图形化界面的应用。

创建第一个窗口

首先我们可以看下面的代码来知道创建一个窗口的步骤。

import tkinter as tk

# 初始对象
window = tk.Tk()
# 设置窗口标题
window.title('My Window')
# 设置窗口大小,并且指定窗口位置
window_size = '500x300+500+300'
window.geometry(window_size)
# 启动主循环显示窗口
window.mainloop()

窗口居中显示

我们在日常的开发中,可以每个电脑的屏幕大小都不太一样,我们设置窗口显示的位置也会发生变化,我们可以通过写一个方法来始终居中我们的任何大小窗口的位置。

import tkinter as tk


# 计算计算机屏幕大小使得窗口始终居中显示
def center_window(windows, width, height):
    screen_width = windows.winfo_screenwidth()
    screen_height = windows.winfo_screenheight()
    x = int(screen_width / 2 - width / 2)
    y = int(screen_height / 2 - height / 2)
    windows_size = '{}x{}+{}+{}'.format(width, height, x, y)
    return windows_size


window = tk.Tk()
window.title('My Window')
# 设置窗口大小,并且指定窗口的实例
window_size = center_window(window, 500, 300)
window.geometry(window_size)
window.mainloop()

Tkinter常用组件

文本显示(Label)

使用方法:

# 初始化对象,设置内容字体以及字体大小
label = tk.Label(root, text='我是Label控件!!!', font=('宋体', 22))

使用实例:

import tkinter as tk

root = tk.Tk()
root.title('文本显示: Label')
root.geometry("500x200+500+300")
label = tk.Label(root, text='我是Label控件!!!', font=('宋体', 22))
label.pack()
root.mainloop()

具体效果图如下:
tkinter

按钮(Button)

使用方法:

# 常规初始化button,设置按钮内容,以及点击事件动作
button = tk.Button(root, text="点击确定", command=button_test)

如果button按钮调用方法需要传参数,则可以使用lambda或者functools.partial方法来进行传参。

# 使用lambda
button = tk.Button(root, text="Say Hello", command=lambda: say_hello("Alice"))
# 使用functools.partial
from functools import partial

greet_func = partial(say_hello, "Bob", 30)
button = tk.Button(root, text="Say Hello", command=greet_func)

使用实例:

import tkinter as tk


def button_test():
    print('我是一个按钮!!!')


root = tk.Tk()
root.title('按钮: Button')
root.geometry("500x200+500+300")
button = tk.Button(root, text="点击确定", command=button_test)
button.pack(pady=30, padx=30)
root.mainloop()

具体效果图如下:
tkinter

输入框(Entry)

使用方法:

# 初始化输入框组件
entry = tk.Entry(root)

使用实例:

import tkinter as tk


def get_entry():
    a = entry.get()
    print(a)


root = tk.Tk()
root.title('输入框: Entry')
root.geometry("500x200+500+300")
entry = tk.Entry(root)
entry.pack(pady=30, padx=30)
button = tk.Button(root, text="点击确定", command=get_entry)
button.pack()
root.mainloop()

具体效果图如下:
tkinter

文本输入框(Text)

使用方法:

# 初始话文本输入框并设置长和宽
text = tk.Text(root, width=30, height=5)

使用实例:

import tkinter as tk

root = tk.Tk()
root.title('文本输入框: Text')
root.geometry("500x200+500+300")
text = tk.Text(root, width=30, height=5)
text.pack(pady=30, padx=30)
root.mainloop()

具体效果图如下:
tkinter

消息对话框(Messagebox)

使用方法:

# 普通消息对话框
messagebox.showinfo('info消息', '我是一个普通消息')
# 警告消息对话框
messagebox.showwarning('警告消息', '我是一个警告消息!!!')
# 错误消息对话框
messagebox.showerror('错误消息', '我是一个错误消息!!!')

使用实例:

import tkinter as tk
from tkinter import messagebox


def info_msg():
    messagebox.showinfo('info消息', '我是一个普通消息')


def warn_msg():
    messagebox.showwarning('警告消息', '我是一个警告消息!!!')


def error_msg():
    messagebox.showerror('错误消息', '我是一个错误消息!!!')


root = tk.Tk()
root.title('消息对话框: Messagebox')
root.geometry("500x200+500+300")
button1 = tk.Button(root, text="普通消息框", command=info_msg)
button2 = tk.Button(root, text="警告消息框", command=warn_msg)
button3 = tk.Button(root, text="错误消息框", command=error_msg)
button1.pack()
button2.pack()
button3.pack()
root.mainloop()

具体效果图如下:
tkinter
tkinter
tkinter

单选按钮(Radiobutton)

使用方法:

# 设置按钮默认选项内容
a = StringVar()
a.set('watermelon')
# 初始化组件,并设置组件的内容和值
radiobutton = tk.Radiobutton(root, text="西瓜", value="watermelon", variable=a)

使用实例:

import tkinter as tk
from tkinter import *
from tkinter import messagebox


def get_radiobutton():
    messagebox.showinfo('测试', '你选择的水果是:' + a.get())


root = tk.Tk()
root.title('单选按钮: Radiobutton')
root.geometry("500x200+500+300")
a = StringVar()
a.set('apple')
radiobutton1 = tk.Radiobutton(root, text="西瓜", value="watermelon", variable=a)
radiobutton2 = tk.Radiobutton(root, text="香蕉", value="banana", variable=a)
radiobutton3 = tk.Radiobutton(root, text="苹果", value="apple", variable=a)
radiobutton1.pack(pady=2, padx=30)
radiobutton2.pack(pady=2, padx=30)
radiobutton3.pack(pady=2, padx=30)
button = tk.Button(root, text="点击确定", command=get_radiobutton)
button.pack(pady=20, padx=30)
root.mainloop()

具体效果图如下:
tkinter

复选按钮(Checkbutton)

使用方法:

# 定义value值的类型
a = tk.IntVar()
b = tk.StringVar()
# 初始化组件,并设置内容参数
checkbutton = tk.Checkbutton(root, text="语文", onvalue=1, offvalue=2, variable=a, command=get_checkbutton_a)
# 设置为默认勾选
checkbutton.select()
# 设置为默认不勾选
checkbutton.deselect()

使用实例:

import tkinter as tk


def get_checkbutton_a():
    status_a = a.get()
    if status_a == 1:
        print('我被选中...')
    else:
        print('我没有被选中...')


def get_checkbutton_b():
    status_b = b.get()
    if status_b == 'yes':
        print('设置成功...')
    elif status_b == 'no':
        print('设置已经取消...')


root = tk.Tk()
root.title('复选按钮: Checkbutton')
root.geometry("500x200+500+300")
a = tk.IntVar()
b = tk.StringVar()
checkbutton1 = tk.Checkbutton(root, text="语文", onvalue=1, offvalue=2, variable=a, command=get_checkbutton_a)
checkbutton1.deselect()
checkbutton1.pack(pady=2, padx=30)
checkbutton2 = tk.Checkbutton(root, text="数学", onvalue='yes', offvalue='no', variable=b, command=get_checkbutton_b)
checkbutton2.select()
checkbutton2.pack(pady=2, padx=30)
checkbutton3 = tk.Checkbutton(root, text="英语", onvalue=1, offvalue=2)
checkbutton3.select()
checkbutton3.pack(pady=2, padx=30)
root.mainloop()

具体效果图如下:
tkinter

下拉选择框(Combobox)

使用方法:

# 需要导入ttk包
from tkinter import ttk

# 设置数值类型
a = tk.StringVar()
# 初始化combobox组件设置父级组件、默认数值类型以及选项组的valus值
combobox = ttk.Combobox(root, textvariable=a, values=('linux', 'ubuntu', 'centos'))
# 设置默认选择项目
combobox.current(0)

使用实例:

import tkinter as tk
import tkinter.ttk


def get_combobox():
    news_a = a.get()
    news_b = b.get()
    print('下拉选项框1的选项是:' + news_a + '\n下拉选项框2的选项是:' + news_b)


root = tk.Tk()
root.title('下拉列选项框: Combobox')
root.geometry("500x240+500+300")
a = tkinter.StringVar()
combobox1 = tk.ttk.Combobox(root, textvariable=a, values=('linux', 'ubuntu', 'centos'))
combobox1.pack(pady=10, padx=10)
combobox1.current(0)
b = tkinter.StringVar()
combobox2 = tk.ttk.Combobox(root, textvariable=b)
combobox2['value'] = ('shell', 'python', 'golang')
combobox2.pack(pady=20, padx=10)
combobox2.current(1)
button = tk.Button(root, text="获取选项内容", command=get_combobox)
button.pack(pady=35, padx=30)
root.mainloop()

具体效果图如下:
tkinter

选择目录按钮

使用方法:

# 导入filedialog模块
from tkinter import filedialog

# 初始化对象并获取目录选项的值
directory = filedialog.askdirectory()

使用实例:

import tkinter as tk
from tkinter import filedialog


def select_directory():
    directory = filedialog.askdirectory()
    entry.delete(0, tk.END)
    entry.insert(0, directory)


root = tk.Tk()
root.title('选择目录按钮: Filedialog')
root.geometry("500x200+500+300")
entry = tk.Entry(root)
entry.pack(pady=30, padx=30)
button = tk.Button(root, text="选择目录", command=select_directory)
button.pack()
root.mainloop()

具体效果图如下:
tkinter

画布(Canvas)

使用方法:

# 初始话canvas组件,父级组件,背景以及长宽高
canvas = tk.Canvas(frame1, bg='white', width=300, height=150)
# 设置画布的布局
canvas.pack(pady=10, side=tk.LEFT, fill=tk.BOTH, expand=True)
# 禁止父容器根据子组件大小自动调整尺寸,1或者Ture是启用
canvas.pack_propagate(0)

使用实例:

import tkinter as tk


list1 = ['西瓜', '香蕉', '苹果', '橙子', '香梨']


def fasong():
    news = entry.get()
    # print(news)
    text.insert(tk.END, news + '\n')
    for food in list1:
        text.insert(tk.END, food + '\n')
    entry.delete(0, tk.END)


root = tk.Tk()
root.title('画布: Canvas')
root.geometry("600x400+400+300")
frame1 = tk.Frame(root, width=600, height=250)
frame1.pack(pady=0)
frame2 = tk.Frame(root, width=600, height=150)
frame2.pack(pady=0)
frame1.pack_propagate(0)
frame2.pack_propagate(0)
canvas = tk.Canvas(frame1, bg='white', width=300, height=150)
canvas.pack(pady=10, side=tk.LEFT, fill=tk.BOTH, expand=True)
canvas.pack_propagate(0)
text = tk.Text(canvas, width=30, height=15, bg='black', font=('华文楷体', 22))
text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar = tk.Scrollbar(canvas, command=text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text.config(yscrollcommand=scrollbar.set)

entry = tk.Entry(frame2, width=30)
entry.pack(pady=20)
button = tk.Button(frame2, text="发送消息", command=fasong)
button.pack(pady=10)
root.mainloop()

具体效果图如下:
tkinter

菜单(Menu)

使用方法:

# 导入Menu方法
from tkinter import Menu

# 创建主菜单对象
top = Menu(root, activebackground='blue', activeforeground='red')
# 创建主菜单下的子菜单对象绑定主菜单对象
menuFile = Menu(top)
# 创建一个级联菜单
top.add_cascade(label="文件", menu=menuFile)
# 设置级联菜单下的选项
menuFile.add_command(label="打开", command=test, accelerator='Ctrl+N')
# 在子菜单中添加一个分隔线
menuFile.add_separator()

使用实例:

import tkinter as tk
from tkinter import Menu


def test():
    print('你已经点击菜单功能...')


root = tk.Tk()
root.title('菜单: Menu')
root.geometry("500x200+500+300")
top = Menu(root, activebackground='blue', activeforeground='red')
menuFile = Menu(top)
top.add_cascade(label="文件", menu=menuFile)
menuFile.add_command(label="打开", command=test, accelerator='Ctrl+N')
menuFile.add_command(label="保存", command=test, accelerator='Ctrl+S')
menuFile.add_separator()
menuFile.add_command(label="退出", command=root.destroy, accelerator='Ctrl+Alt')
chooseFile = Menu(top)
top.add_cascade(label="选项", menu=chooseFile)
chooseFile.add_command(label="放大", command=test)
chooseFile.add_command(label="缩小", command=test)
root.config(menu=top)
root.mainloop()

具体效果图如下:
tkinter

框架边框(Frame)

使用方法:


使用实例:

import tkinter as tk

root = tk.Tk()
root.title('框架边框: Frame')
root.geometry("500x200+500+300")
frame1 = tk.Frame(root, width=500, height=100, bg='blue')
frame1.pack(pady=0)
frame2 = tk.Frame(root, width=500, height=100, bg='red')
frame2.pack(pady=0)
frame1.pack_propagate(0)
frame2.pack_propagate(0)
label1 = tk.Label(frame1, text='我是Frame1!!!', bg='green')
label1.pack()
label2 = tk.Label(frame2, text='我是Frame2!!!', bg='yellow')
label2.pack()
root.mainloop()

具体效果图如下:
tkinter