python学习第十二节:python开发图形界面

发布于:2024-10-12 ⋅ 阅读:(11) ⋅ 点赞:(0)

在这里插入图片描述

Tkinter是Python的标准GUI库,它提供了丰富的组件和布局管理器,能够帮助我们快速地创建图形用户界面应用程序。

import tkinter 或者 import tkinter as tk

创建一个窗口

实例化窗口对象

root= tk.Tk()

调用窗口

root.mainloop() 

调用此代码会显示一个真实的窗口,接下来整个丰富GUI的操作使用的代码,都是放在这2句代码中间

设置窗口大小

第一种方式:直接固定宽高。这种方式打开的窗口位置不居中

root.geometry('500x400')

第二种方式:固定宽高,并将窗口居中

screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
x = int((screenwidth - 500) / 2)
y = int((screenheight - 500) / 2)
size = '{}x{}+{}+{}'.format(500, 400, x, y)
root.geometry(size)

第三种方式:直接确定窗口位置

root.geometry("800x500+374+182")  #程序窗口左角距离电脑左上角的坐标也即是距离

设置窗口的标题

root.title("第一个窗口哦")

设置窗口图标

root.iconbitmap("qk.png")  # 添加自己图片的路径

否能够改变窗口

root.resizable(False, False) # 设置为false就是固定窗口大小 不能更改

设置窗口的背景

root.config(bg="blue")

不会改变顶部标题行的颜色

完整报文:

"""
简单些一个图形界面
Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python自带的,可以编辑的GUI界面,用来入门,熟悉窗口视窗的使用,非常有必要。
"""
# 导入tkinter库
import tkinter as tk

# 创建顶层窗口
root = tk.Tk()  # root window frame
# 设置标题
root.title('第一个窗口')

# 设置窗口大小,
# -第一种方式:直接固定宽高。这种方式打开的窗口位置不居中
root.geometry('500x400')
# -第二种方式:固定宽高,并将窗口居中
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
x = int((screenwidth - 500) / 2)
y = int((screenheight - 500) / 2)
size = '{}x{}+{}+{}'.format(500, 400, x, y)
root.geometry(size)
# -第三种方式:直接确定窗口位置
root.geometry("800x500+374+182")  #程序窗口左角距离电脑左上角的坐标也即是距离

# 设置窗口图标
root.iconbitmap("qk.png")  # 添加自己图片的路径

# 否能够改变窗口
root.resizable(False, False) # 设置为false就是固定窗口大小 不能更改

# 设置窗口的背景,不会改变顶部标题行的颜色
root.config(bg="blue")

# 进入消息循环,显示窗口
root.mainloop()

创建容器组件

容器组件的介绍

组件 功能
Label 标签控件,用来在窗口上显示文本和图片
Message 消息控件,用来显示多行文本,与Label功能类似
Button 按钮控件,用户可以点击按钮,点击事件将会传递给设置的回调函数
Entry 文本输入框控件,用户可以输入文字,但只能在一行输入
Text 多行文本输入框控件,用户可以输入多行文字,自由换行
Canvas 画布控件,可以在上面显示基本图形、文字、图片
Frame 框架控件,作为一个小容器,相当于给组件分组。
LabelFrame 文字框架控件,和Frame不同的是,框架外面多了文本提示
Menu 菜单控件,在窗口上显示菜单,或定义弹出式菜单。
Menubutton 菜单按钮控件,是Button的样子,点击后弹出一个菜单。
Checkbutton 多选按钮,用户可以勾选或取消勾选。
Radiobutton 单选按钮,用户可以在同类的Radiobutton中选择一个,无法取消勾选
Listbox 列表框组件,可以显示一个字符串的列表
Scrollbar 滚动条控件,用来添加一个滚动条控制滚动
Scale 尺度条控件,用来添加一个数字滑块,用户可以滑动调整数值。
Spinbox 数字选值框控件,用户既可以输入数字,也可以按调节按钮调整数值。
OptionMenu 选项菜单,用户可以从下拉菜单中选择一个值,但是不能自己输入。
PanedWindow 分栏容器控件,和Frame类似,但是有更多的功能设定,比如用户可以调节大小
Toplevel 上层窗口控件,可以定义某个窗口的子窗口。

组件参数的介绍

大多数组件的类也都有一些共同的参数

参数名称 作用
master 组件的父容器,一般必选
name 组件在TcI/Tk内部的名称
bg/background 改变组件的背景(ttk没有)
fg/foreground 改变组件的前景色,一般是文本颜色
width 组件的宽,单位是像素(在文本输入类组件中,单位是字符数量)
height 组件的高,单位是像素(在文本输入类组件中,单位是字符数量)
cursor 鼠标放上组件的光标样式
relief 组件边框样式
state 组件状态,可设置为normal(普通样式).disabled(禁用),active(激活),readonly(只读)。其中normal和disabled所有组件都支持,而active,readonly只有部分组件支持。
takefocus 组件是否能获取焦点
bd/borderwidth 组件边框的宽度
activebackground 组件激活时的背景色
activeforeground 组件激活时的前景色
disabledforeground 组件禁用时的前景色
disabledbackground 组件禁用时的背景色
highlightcolor 高亮(组件获得焦点)时的边框颜色
highlightthickness 高亮边框宽度
exportselection 这个是所有含有输入功能的组件的共有参数,表示选中的内容是否可以被Misc.selection_get方法检测到,参见后文对Misc类的介绍

组件也有一些共同的方法:

方法名称 作用
after(ms, func=None) 等待ms毫秒后执行-次func
bind(sequence=None.func=None) 绑定事件,检测到事件后调用func
unbind(sequence) 解除绑定事件
update() 刷新组件,一般不需要手动调用
cget(key) 返回关键字参数key的值,如:root.cget(“bg”)返回root的背景色
configure(**kw) 也写作config,重新改变组件的关键字参数设置
destroy() 销毁组件
focus_set() 设置输入焦点

label标签

也就是在界面上显示的文本,比如输入框前面的标签文字

label添加标签控件
lbl = tk.Label(root, text="员工名称",font=("微软雅黑",22),fg="blue")
其中font字体有很多参数配置,比如:
font=("黑体", 20, "bold", "italic", "underline", "overstrike")
参数名称 作用
text 显示的文本
font 文本的字体 ,如:font=(“黑体”, 20, “bold”, “italic”, “underline”, “overstrike”)
image 显示的图片
bitmap 显示的位图,和image只能指定一个
textvariable 绑定的文本变量
compound 当文本和图片同时显示时,图片位于文本的方位,可以是top,bottom,left,rightcenter,如:设置为top表示图片位于文本上方
padx 标签内容与左右的间距
pady 标签内容与上下的间距
anchor 文本靠标签哪个方向显示,可以是n,s,we,ne,nw,sw,se,center,即北、南、西东、东北、西北、西南、东南、中间,默认靠中间显示
justify 文本的对齐方式,可以是left,right,center,默认是center
wraplength 自动换行字符数量,到达数量后文本会自动换一行显示

label添加标签定位

‌Tkinter中的grid()方法是一种布局管理器,用于将组件按照网格的形式进行布局。‌这种方法特别适用于创建表格或类似表格的界面布局。使用grid()方法,可以将组件放置在特定的行和列中,并且还可以让组件跨越多个行或列。
在这里插入图片描述

以下是关于grid()方法的一些关键点和用法:

1‌.创建Grid布局‌:在Tkinter中,可以使用grid()方法创建一个Grid布局。例如,以下代码将一个Label组件放置在Grid布局中的第一行第一列:

from tkinter import *
root = Tk()
label = Label(root, text="Hello, world!")
label.grid(row=0, column=0)
root.mainloop()

2.‌指定行和列‌:可以使用row和column参数指定组件在Grid布局中的具体位置。例如,以下代码将一个Label组件放置在第3行第2列:

label = Label(root, text="Hello, world!")
label.grid(row=2, column=1)

3.‌指定组件跨越多个行和列‌:使用rowspan和columnspan参数可以让组件跨越多个行或列。例如,以下代码将一个Label组件放置在第1行第1列,并跨越第1行和第2行:

label = Label(root, text="Hello, world!")
label.grid(row=0, column=0, rowspan=2)

4.‌指定组件的对齐方式‌:使用sticky参数可以指定组件在其网格中的对齐方式。例如,以下代码将一个Label组件放置在第1行第1列,并将其向西对齐:

label = Label(root, text="Hello, world!")
label.grid(row=0, column=0, sticky=W)

5.指定行和列的权重‌:可以使用rowconfigure()和columnconfigure()方法指定行和列的权重。权重用于确定行和列在窗口调整大小时所分配的额外空间。例如,以下代码将第1列的权重设置为1:

root.columnconfigure(1, weight=1)

示例1:
在这里插入图片描述

from tkinter import *
 
root = Tk()
root.title("Practice with Grid")
root.geometry("310x280")  # set starting size of window
 
def display_checked():
    '''check if the checkbuttons have been toggled, and display
    a value of '1' if they are checked, '0' if not checked'''
    red = red_var.get()
    yellow = yellow_var.get()
    green = green_var.get()
    blue = blue_var.get()
 
    print("red: {}\nyellow:{}\ngreen: {}\nblue: {}".format(
        red, yellow, green, blue))
 
# Create label
label = Label(root, text="Which colors do you like below?")
label.grid(row=0)
 
# Create variables and checkbuttons
red_var = IntVar()
Checkbutton(root, width=10, text="red", variable=red_var, bg="red").grid(row=1)
 
yellow_var = IntVar()
Checkbutton(root, width=10, text="yellow", variable=yellow_var, bg="yellow").grid(row=2)
 
green_var = IntVar()
Checkbutton(root, width=10, text="green", variable=green_var, bg="green").grid(row=3)
 
blue_var = IntVar()
Checkbutton(root, width=10, text="blue", variable=blue_var, bg="blue").grid(row=4)
 
# Create Buttons, one to check which colors are checked,
# and another to close the window.
Button(root, text="Tally", command=display_checked).grid(row=5)
Button(root, text="End", command=root.quit).grid(row=6)
 
root.mainloop()

分析:在该示例中,所有组件各占一行,因此,不需要考虑列如何安排,因而很简单。

    首先,我们首先导入 Tkinter 并在第 1-5 行中设置根窗口。 display_checked() 函数与 Checkbutton 对象一起使用,以查看哪些框已被选中。 get() 方法检查框是否已被选中,如果是,则返回值“1”以表示选中。如果不是,则为“0”。我们在第 19 行创建一个标签来显示我们的问题。请注意第 20 行如何使用 grid() 将标签放置在窗口中。 row 参数设置为 0,但在本例中,对于第一个小部件来说不是必需的。这是因为 grid() 的默认值为 row=0、column=0。另外,该列不包含参数,因为我们在此界面中只有一列。

示例2:
在这里插入图片描述

from tkinter import *

root = Tk()
root.title("Profile Entry using Grid")
root.geometry("500x300")  # set starting size of window
root.maxsize(500, 300)  # width x height
root.config(bg="lightgrey")

# Profile picture
image = PhotoImage(file="unit/1.gif")
small_img = image.subsample(4, 4)

img = Label(root, image=small_img)
img.grid(row=0, column=0, rowspan=6, padx=5, pady=5)

# Enter specific information for your profile into the following widgets
enter_info = Label(root, text="Please enter your information: ", bg="lightgrey")
enter_info.grid(row=0, column=1, columnspan=4, padx=5, pady=5)

# Name label and entry widgets
Label(root, text="Name", bg="lightgrey").grid(row=1, column=1, padx=5, pady=5, sticky=E)

name = Entry(root, bd=3)
name.grid(row=1, column=2, padx=5, pady=5)

# Gender label and dropdown widgets
gender = Menubutton(root, text="Gender")
gender.grid(row=2, column=2, padx=5, pady=5, sticky=W)
gender.menu = Menu(gender, tearoff=0)
gender["menu"] = gender.menu

# choices in gender dropdown menu
gender.menu.add_cascade(label="Male")
gender.menu.add_cascade(label="Female")
gender.menu.add_cascade(label="Other")
gender.grid()

# Eyecolor label and entry widgets
Label(root, text="Eye Color", bg="lightgrey").grid(row=3, column=1, padx=5, pady=5, sticky=E)
eyes = Entry(root, bd=3)
eyes.grid(row=3, column=2, padx=5, pady=5)

# Height and Weight labels and entry widgets
Label(root, text="Height", bg="lightgrey").grid(row=4, column=1, padx=5, pady=5, sticky=E)
Label(root, text="inches", bg="lightgrey").grid(row=4, column=3, sticky=W)

height = Entry(root, bd=3)
height.grid(row=4, column=2, padx=5, pady=5)

Label(root, text="Weight", bg="lightgrey").grid(row=5, column=1, padx=5, pady=5, sticky=E)
Label(root, text="lbs", bg="lightgrey").grid(row=5, column=3, sticky=W)

weight = Entry(root, bd=3)
weight.grid(row=5, column=2, padx=5, pady=5)

root.mainloop()

label的relief参数

组件边框的样式,一共有6种relief,分别是flat, groove, raised, ridge, solid, sunken

label = Label(tk,text="URL",font=("宋体",22),fg="blue",relief="sunken")

label的cursor参数

指定鼠标移动到组件上时,光标的样子

label = Label(tk,text="URL",font=("宋体",22),fg="blue",relief="sunken",cursor="hand2")

在这里插入图片描述

label的font参数

font参数指定字体的样式、大小、以及是否有加粗下划线等特殊样式,字体的特殊样式,一共有bold(加粗), italic(斜体),underline(下划线),overstrike(删除线)

Label(tk, text="叠加", font=("黑体", 20, "bold", "italic", "underline", "overstrike")).grid()

label的bitmap参数

bitmap=“error”,即内置图标,有error, info, hourglass, questhead, question, warning, gray12, gray25, gray50, gray75
compound=“left” 图片在文字的左边

label = tkinter.Label(tk,text="error",bitmap="error",compound="left",font=("宋体",22),fg="blue")

label的image参数

在Label中添加图片

image = PhotoImage(file=r"Pictures\1000.png")
Label(tk, image=image, text="It's a monster.", compound="top").grid()

在Label中添加jpg图片需要使用pillow工具 导入时 import PIL

from tkinter import *
from PIL import Image, ImageTk
tk = Tk()
image = ImageTk.PhotoImage(Image.open("1000.jpg"))
Label(root, image=image, text="It's a monster.", compound="top").grid()
tk.mainloop()

tkinter也有一些内部的图片,可以通过字符串传递给image。

from tkinter import *
tk = Tk()
for image in ["::tk::icons::error",
              "::tk::icons::information",
              "::tk::icons::question",
              "::tk::icons::warning"]:
    Label(tk, text=image, image=image, compound="top").grid()
tk.mainloop()

entry输入框

entry是一个文本框组件可以在里面输入文本

entry的参数:
在这里插入图片描述
entry的方法:
在这里插入图片描述

entry添加输入框定位

entry = Entry(tk,font=("宋体",25),fg="black")
entry.grid(row=1,column=10)
# row=0,column=1表示我们将输入框控件,放在第1行第2列的位置

创建输入框

import tkinter as tk

# 创建Tkinter窗口
root = tk.Tk()
root.title("Tkinter文本框示例")
root.geometry("500x300")  # set starting size of window
root.maxsize(500, 300)  # width x height
root.config(bg="lightgrey")
# 创建文本框
entry = tk.Entry(root)

# 创建按钮点击事件处理程序
def button_click():
    text = entry.get()
    label.config(text="你输入的文本是:" + text)

# 创建按钮
button = tk.Button(root, text="获取文本", command=button_click)

# 创建标签
label = tk.Label(root, text="")

# 将文本框、按钮和标签添加到窗口
entry.pack()
button.pack()
label.pack()

# 启动Tkinter主事件循环
root.mainloop()

设置初始值

方法一:

entry.insert(0, '张三')  # 设置输入框的默认文本

方法二:

e=StringVar()
entry = tk.Entry(root,textvariable=e)
e.set("张三")

设置提示语句

entry没有设置提示语句的参数和方法,只有我们自己写一个方法;添加一个事件,当Entry组件被点击时,清空提示文本

import tkinter as tk
# 创建窗口
root = tk.Tk()
root.title("输入框设置提示语句")
# 设置窗口大小
root.geometry("400x200")
# 创建Entry组件
entry = tk.Entry(root)
# 添加Entry组件到窗口
entry.pack()
# 创建提示文本
hint_text = "请输入用户名称"
# 将提示文本显示在Entry组件中
entry.insert(0, hint_text)
# 添加事件,当Entry组件被点击时,清空提示文本
def on_click(event):
	if entry.get() == hint_text:
		entry.delete(0, "end") #清空输入框
entry.bind("<FocusIn>", on_click) # 监听输入框获取焦点的事件
# 显示提示文本,当输入框失去焦点时显示提示语句
def on_focus_out(event):
	if not entry.get():
		entry.insert(0, hint_text)  # 如果输入框为空,则显示提示语
entry.bind('<FocusOut>', on_focus_out)  # 监听输入框失去焦点的事件
# 第二个输入框,用于测试上面输入框失去焦点
tk.Entry(root).pack()
# 运行窗口
root.mainloop()

输入框设置为只读/禁用

entry2=tk.Entry(root)
entry2["state"]="readonly"
entry2.pack()

Entry的属性值可以使用的也为normal/active/disabled,'readonly’与disabled一样,处于readonly的Entry不能被输入,但是用户可以选中Entry里面插入的内容,当然也可以复制。如果是disabled状态,用户不但不能输入,而且不能选中里面的内容。

设置密码输入框

entry2=tk.Entry(root)
entry2["show"]="*"
entry2.pack()

输入框内容验证

Entry 组件是支持验证输入内容的合法性的,比如要求输入数字,你输入了字母那就是非法。
实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 选项。
首先启用验证的“开关”是 validate 选项,该选项可以设置的值有:

  • focus:当 Entry 组件获得或失去焦点的时候验证
  • focusin: 当 Entry 组件获得焦点的时候验证
  • focusout: 当 Entry 组件失去焦点的时候验证
  • key:当输入框被编辑的时候验证
  • all: 当出现上边任何一种情况的时候验证

其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。
一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
然后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。

def validateText():
	val = entry3.get()
	if val == '654321':
		print("正确!")
		return True
	else:
		'''''
		删除内容,-- 删除参数 first 到 last 范围内(包含 first 和 last)的所有内容
		-- 如果忽略 last 参数,表示删除 first 参数指定的选项
		-- 使用 delete(0, END) 实现删除输入框的所有内容
	   '''
		entry3.delete(0, "end")
		return False

def test():
	print('你输入错了')
	return True

e = StringVar()
entry3 = tk.Entry(root, textvariable=e, validate='focusout', validatecommand=validateText,invalidcommand=test)
entry3.pack()

entry的show参数

可以使输入里面的内容显示为一个*或其他指定字符

entry = Entry(tk,font=("宋体",25),fg="black",show="*").grid()

entry的get方法

获取文本框的值

entry = Entry(tk) #创建一个输入框
entry.pack()
def entryget():
    print(entry.get())
button = Button(tk, text="显示", command=entryget).pack()

button按钮

Button的参数和Label基本参数是通用的,也支持text, image, bitmap
在这里插入图片描述

添加按钮组件

button = tkinter.Button(tk,text="开始扫描",font=("宋体",14),fg="black")

添加按钮点击事件

Button即按钮,可以绑定一个回调函数,用户点击时将会执行这个函数。

def mulu():
    print("显示扫描目录")
button = tkinter.Button(tk,text="开始扫描",font=("宋体",14),fg="black",command=mulu)

按钮被点击的样式

我们可以设置点击时按钮的前景和背景颜色:

Button(root, text="按钮", activeforeground="blue", activebackground="yellow")

重复触发

长按在按钮上,经过repeatdelay毫秒的延迟后,按钮将会重复触发,每次触发的间隔是repeatinterval毫秒。

def func():
    print("开始扫描")
button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black", repeatdelay=1, repeatinterval=5,command=func())

禁用按钮

所有组件都有state参数,表示组件的状态。一共有三个状态:normal, disabled, active。默认的state是normal,此时用户可以点击按钮。而处于disabled禁用的按钮,用户将无法点击。active则是激活状态。

Button(root, text="按钮", state="disabled")

布局设置(pack,grid,place)

pack

side:组件靠哪个方向排放,可以是"top", “bottom”, “left”, “right”,分别是上下左右,默认是"top"

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.pack(side=BOTTOM)

anchor:当排放组件的可用空间要多于所需空间时,组件靠哪个方向排放,可选项是八个方位和中心(n, s, w, e, nw, ne, sw, se, center)。默认是"nw"。

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.pack(anchor=CENTER)

expand:组件适应窗口。如设置为True,当窗口中有别的可用空间时,将会自动把组件居中摆放,并且拖拽后仍然适应窗口大小。默认为False。组件的填充,可选项有"x", “y”, “both”, “none”,分别表示:x方向填充,y方向填充,两个方向都填充,无填充

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.pack(button.pack(expand=1, fill=BOTH))
button.pack(expand=True)

padx和pady:分别表示组件与外部容器在x轴和y轴的间隔。可以只提供一个数字,表示左右间隔或上下间隔,也可以提供一个两个项的元组表示左右间隔或上下间隔。不一定要一起设置。

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.pack(padx=100, pady=60) #左右间隔100,上下间隔60

ipadx和ipady:表示内部与组件边框的间隔

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.pack(ipadx=10, ipady=10)

grid

grid可以实现网格布局,根据行和列指定组件的位置
row和column:分别指定组件排列的行和列,row和column指定以0为起点,第一行就是row=0。

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.grid(row=0, column=0)
button.grid(row=1, column=0)
button.grid(row=0, column=1)
button.grid(row=1, column=1)

rowspan和columnspan:rowspan表示组件占几行的大小,columnspan表示组件占几列的大小。

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.grid(grid(row=0, column=1, rowspan=2))

sticky:在pack布局中和anchor类似,表示组件的方位,同时也可以达到fill的功能。可以提供八个方位+center,来指定组件在可用空间中的排列位置。

button = Button(tk, text="开始扫描", font=("宋体", 25), fg="black")
button.grid(row=1, column=0, sticky="e")

place

place布局适用于更加复杂的,需要准确摆放组件的容器,需要提供xy坐标以及组件的width和height

  • x和y:组件在x轴和y轴上的位置,单位为像素
  • width和height:指定组件排放时的宽和高
  • anchor:组件的锚选项,可选有八个方位,以及center
  • relx和rely:组件在x轴或y轴相对于整个容器的位置,是一个0-1之间的浮点数,表示组件位于整个容器的位置。比如想要把组件的x设在容器30%的位置,则可以把位置设为0.3.如果想要把组件居中,就设置relx=0.5, rely=0.5, anchor=“center”。
  • relwidth和relheight:指定组件相对于容器的宽与高,是一个0-1之间的浮点数。组件宽是容器宽的50%,则可以把relwidth设置为0.5.

Frame框架

相当于一个盒子,用于存放组件,方便组件的排放

fr = Frame(root)
fr.pack(padx=5, pady=5)
button = Button(fr, text="开始扫描", font=("宋体", 25), fg="black").pack(side="left")
button = Button(fr, text="开始扫描", font=("宋体", 25), fg="black").pack(side="left")
button = Button(fr, text="开始扫描", font=("宋体", 25), fg="black").pack(side="left")

LabelFrame文本框架

可以在左上方显示一段文本或是一个组件

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("LabelFrame文本")
# 设置窗口大小
root.geometry("400x200")

fr = tk.LabelFrame(root, text="订单信息")
fr.pack(fill="both", padx=4)
tk.Button(fr, text="1").pack()
tk.Button(fr, text="2").pack()

# 运行窗口
root.mainloop()

在这里插入图片描述
LabelFrame的labelwidget参数:
上面显示的一段文字可以把它替换为别的组件

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("LabelFrame文本")
# 设置窗口大小
root.geometry("400x200")

fr = tk.LabelFrame(root, text="订单信息",labelwidget=tk.Button(root, text="按钮"))
fr.pack(fill="both", padx=4)
tk.Button(fr, text="1").pack()
tk.Button(fr, text="2").pack()

# 运行窗口
root.mainloop()

在这里插入图片描述

Toplevel创建新的窗口

Toplevel可以用来创建一个新的窗口,它必须继承一个窗口,可以是Tk,也可以是Toplevel

root = tk.Tk()
top = tk.Toplevel(root)

Checkbutton 多选框

多选框,用户可以勾选或取消勾选
在这里插入图片描述
在这里插入图片描述

创建多选框

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("输入框设置提示语句")
# 设置窗口大小
root.geometry("400x200")

def ck():
    print("选中/取消选中")

cb = tk.Checkbutton(root, text="连续扫描", command=ck)
cb.pack()

# 运行窗口
root.mainloop()

Checkbutton的variable参数

获取复选框的选择值

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("输入框设置提示语句")
# 设置窗口大小
root.geometry("400x200")

def ck():
    print("当前状态为:", cb_var.get())

cb_var = tk.BooleanVar()
cb = tk.Checkbutton(root, text="连续扫描", command=ck, variable=cb_var)
cb.pack()

# 运行窗口
root.mainloop()

Checkbutton的indicatoron参数

一种是上面的勾选框样式,还可以设置为一个按钮盒的样式

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("输入框设置提示语句")
# 设置窗口大小
root.geometry("400x200")

def ck():
    print("当前状态为:", cb_var.get())

cb_var = tk.BooleanVar()
cb = tk.Checkbutton(root, text="连续扫描", command=ck, variable=cb_var, indicatoron=False)
cb.pack()

# 运行窗口
root.mainloop()

indicatoron=True:
在这里插入图片描述

indicatoron=False:

在这里插入图片描述
在这里插入图片描述

Radiobutton 单选框

单选框 value参数的作用是:指定单选框选中时绑定的Var的值

Radiobutton(tk, text="A. Python", variable=var, value="A").pack()

当variable的值被设为单选框的value,那么这个选框将是选中的状态。当点击单选按钮,variable的值就被设为这个单选按钮的值。因为variable的值只能有一个,所以你只能在绑定该variable的单选按钮里面选中一个单选按钮。

var=tk.StringVar()
var.set("A")
tk.Radiobutton(root, text="A. Python", variable=var, value="A").pack()
tk.Radiobutton(root, text="B. Python", variable=var, value="B").pack()
tk.Radiobutton(root, text="C. Python", variable=var, value="C").pack()

在这里插入图片描述

Menu 菜单

Menu也就是菜单,菜单一般有两种,一种是窗口上的菜单,一种是弹出式菜单。
在这里插入图片描述
在这里插入图片描述

创建窗口菜单

menubar = Menu(tk)
tk.config(menu=menubar) #把菜单绑定tk

菜单内容

在这里插入图片描述

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("菜单")
# 设置窗口大小
root.geometry("400x200")

menubar = tk.Menu(root)
root.config(menu=menubar)
menubar.add_command(label="按钮", command=lambda: print("Hello"))  # 点击菜单的Click按钮,就会执行print("Hello")

# 运行窗口
root.mainloop()

在这里插入图片描述

Menu的分层菜单

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("菜单")
# 设置窗口大小
root.geometry("400x200")

menubar1 = tk.Menu(root)
menubar2 = tk.Menu(menubar1)
menubar3 = tk.Menu(menubar2)
menubar3.add_command(label="三级菜单", command=lambda:print("OK!")) #子菜单
menubar2.add_cascade(label="二级菜单", menu=menubar3) #子菜单
menubar1.add_cascade(label="一级菜单", menu=menubar2)
root.config(menu=menubar1)

# 运行窗口
root.mainloop()

在这里插入图片描述

Menu的菜单快捷键

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("菜单")
# 设置窗口大小
root.geometry("400x200")

def new(event=None):
    print("New file")

menubar1 = tk.Menu(root)
menubar2 = tk.Menu(menubar1)
menubar3 = tk.Menu(menubar2)
menubar3.add_command(label="三级菜单",accelerator="Ctrl+N", command=new) #子菜单
menubar2.add_cascade(label="二级菜单", menu=menubar3) #子菜单
menubar1.add_cascade(label="一级菜单", menu=menubar2)
root.config(menu=menubar1)
root.bind("<Control-n>", new) #监听Ctrl+N触发new函数
# 运行窗口
root.mainloop()

Menu的菜单分割线

add_separator方法可以给菜单添加一条分割线
在这里插入图片描述

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("菜单")
# 设置窗口大小
root.geometry("400x200")

def new(event=None):
    print("New file")

menubar1 = tk.Menu(root)
menubar2 = tk.Menu(menubar1)
menubar3 = tk.Menu(menubar2)
menubar3.add_command(label="三级菜单1",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_command(label="三级菜单2",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_command(label="三级菜单3",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_separator() #添加分割线
menubar3.add_command(label="退出", command=new) #子菜单

menubar2.add_cascade(label="二级菜单", menu=menubar3) #子菜单
menubar1.add_cascade(label="一级菜单", menu=menubar2)
root.config(menu=menubar1)
root.bind("<Control-n>", new)
# 运行窗口
root.mainloop()

Menu的菜单快捷触发

underline参数指定一个索引,绑定一个Alt快捷键。指定了underline的菜单项可以快捷触发。触发方式是:先按下Alt,然后下划线会显示出来,再按下菜单项标签下划线上的字符即可执行这个菜单项。比如下面代码,菜单名称是New,underline下标是0,点击Alt键时会在N下面,这时我们只需要点击N键即可触发

menu = Menu(root)
root.config(menu=menu)
 
def new():
    print("New file")
 
menu.add_command(label="New", underline=0, command=new)

在这里插入图片描述

Menu的弹出菜单

当右击鼠标时在鼠标处弹出菜单
弹出窗口需要使用post方法,需要提供x, y两个参数。但这两个参数必须是屏幕上的位置,x_root和y_root。
在这里插入图片描述

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("右键菜单")
# 设置窗口大小
root.geometry("400x200")

def new(event=None):
    print("New file")

def show(event):
    menubar3.post(event.x_root, event.y_root)

menubar3 = tk.Menu(root)
menubar3.add_command(label="三级菜单1",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_command(label="三级菜单2",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_command(label="三级菜单3",accelerator="Ctrl+N", command=new) #子菜单
menubar3.add_separator() #添加分割线
menubar3.add_command(label="退出", command=new) #子菜单

#root.config(menu=menubar3)

root.bind("<Button-3>", show) #点击鼠标右键打开菜单

# 运行窗口
root.mainloop()

Menubutton 菜单

Menubutton是一个Button的样式,可以绑定一个菜单,点击后弹出菜单。这个组件比较老,现在可以用Menu实现Menubutton的功能了,不过Menubutton在某些情况下要更简单好用一些
在这里插入图片描述

mb = Menubutton(root, text="弹出")
mb.pack()
 
menu = Menu(mb)
def cp():
    print("Copy")
menu.add_command(label="Copy", command=cp)
 
mb.config(menu=menu)

Listbox 列表框

列表框,里面可以添加一些文本项目,在列表框中竖向显示
在这里插入图片描述
在这里插入图片描述

创建Listbox

import tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("列表框")
# 设置窗口大小
root.geometry("400x200")

lb = tk.Listbox(root)
lb.pack()

for n in range(20):
    lb.insert("end", n)

def select(event):
    print(lb.curselection())  # 打印选中项的索引

lb.bind("<<ListboxSelect>>", select)

# 运行窗口
root.mainloop()

在这里插入图片描述

see方法

see方法可以滚动列表框,使位于index位置的项目可见;就类似跳转顶部,跳转底部功能

lb = Listbox(root)
lb.pack()
 
for n in range(20):
    lb.insert("end", n)
 
Button(root, text="see end", command=lambda:lb.see("end")).pack()

Scrollbar 滚动条

滚动条,可以起到滚动组件,使用户能够完整看到的效果。但也有部分组件不支持滚动条

sb = Scrollbar(root)
sb.pack(side="right", fill="y")

OptionMenu 下拉菜单

var = StringVar()
var.set("Python") #设置OptionMenu的值
 
m = OptionMenu(root, var, "Python", "C", "Java")
m.pack()

Text 多行文本输入框

Text是多行文本输入框,和Entry不同的是,Entry只有单行。并且Text里面不仅能够插入文本,还可以插入图片、组件等,还可以有标记功能,对于特殊的内容改变颜色。

设置Text

text = Text(root)
text.pack()

撤销和重做

设置undo=True,然后用户可以按Ctrl+Z来撤销

text = Text(root, undo=True)
text = Text(root, undo=1)
text.pack()
 
Button(root, text="Undo", command=text.edit_undo).pack()
Button(root, text="Redo", command=text.edit_redo).pack()

关闭窗口

destroy()