python从入门到精通(十七):python的图形化界面开发

Tkinter

Tkinter模块的概念

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

导入模块

python3

import tkinter

pytohn2

import Tkinter # 开头的t是大写的

1.创建窗口的操作

实例化窗口对象

tk = tkinter.Tk()

调用窗口

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

tk.mainloop()

设置窗口大小

tk.geometry("800x500")  #宽x高 不用*

设置窗口位置

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

设置窗口的标题

tk.title("hackone的目录扫描工具")

设置窗口的图标

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

否能够改变窗口

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

设置窗口的背景

tk.config(bg="blue")

2.创建容器组件的操作

容器组件的介绍

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

组件参数的介绍

大多数组件的类也都有一些共同的参数
在这里插入图片描述
组件也有一些共同的方法:
在这里插入图片描述

label标签

label添加标签控件

text参数指定显示的文本
font参数指定字体大小和字体样式
fg参数指定字体颜色

label = Label(tk,text="URL",font=("宋体",22),fg="blue")  #tk是master父容器 不指定不会显示在主窗口的
font=("黑体", 20, "bold", "italic", "underline", "overstrike")

在这里插入图片描述

label添加标签定位

只有调用grid()方法,定位后,才会显示

label.grid()  # label.grid()等价于label.grid(row=0,column=0)
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"C:\Users\liyang\Pictures\Saved 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(tk,font=("宋体",25),fg="black")
entry.grid(row=1,column=10)
# row=0,column=1表示我们将输入框控件,放在第1行第2列的位置
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()
readonly状态

Entry可以设置为state="readonly",也就是只读状态。处于readonly的Entry不能被输入,但是用户可以选中Entry里面插入的内容,当然也可以复制。如果是disabled状态,用户不但不能输入,而且不能选中里面的内容。

button按钮

添加按钮组件

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

button = tkinter.Button(tk,text="开始扫描",font=("宋体",14),fg="black")
设计按钮功能

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

def mulu():
    print("显示扫描目录")

command=mulu 点击执行mulu 这个函数

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文本框架

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

fr = LabelFrame(root, text="LabelFrame")
fr.pack(fill="both", padx=4)
 
Button(fr, text="1").pack()
Button(fr, text="2").pack()
LabelFrame的labelwidget参数

上面显示的一段文字可以把它替换为别的组件

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

Toplevel创建新的窗口

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

from tkinter import *
 
tk = Tk()
top = Toplevel(tk)
mainloop()

Checkbutton 多选框

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

Checkbutton创建多选框
def ck():
    print("选中/取消选中")
 
cb = Checkbutton(tk, text="连续扫描", command=ck)
cb.pack()
Checkbutton的variable参数
def ck():
    print("当前状态为:", cb_var.get())
 
cb_var = BooleanVar()
cb = Checkbutton(tk, text="连续扫描", command=ck, variable=cb_var)
cb.pack()
Checkbutton的indicatoron参数

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

tk = Tk()
tk.geometry("200x200")
 
cb = Checkbutton(root, text="连续扫描", indicatoron=False)
cb.pack()

Radiobutton 单选框

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

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

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

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

Menu 菜单

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

Menu创建窗口菜单
menubar = Menu(tk)
tk.config(menu=menubar) #把菜单绑定tk
Menu的添加菜单内容

在这里插入图片描述

menubar = Menu(tk)
tk.config(menu=menubar)
 
menubar.add_command(label="Click", command=lambda:print("Hello"))  # 点击菜单的Click按钮,就会执行print("Hello")
Menu的分层菜单
menubar = Menu(tk)
tk.config(menu=menubar)
 
filemenu = Menu(menubar)
filemenu.add_command(label="Save", command=lambda:print("OK!")) #子菜单
 
menubar.add_cascade(label="File", menu=filemenu)

子菜单添加子菜单

menubar = Menu(tk)
tk.config(menu=menubar)
 
filemenu = Menu(menubar)
savemenu = Menu(filemenu)
 
menubar.add_cascade(label="File", menu=filemenu)
filemenu.add_cascade(label="Save", menu=savemenu)
 
savemenu.add_command(label="save1")
savemenu.add_command(label="save2")

Menu的菜单快捷键
menubar = Menu(tk)
tk.config(menu=menubar)
 
def new(event=None):
    print("New file")
 
fm = Menu(menu)
menu.add_cascade(label="File", menu=fm)    
fm.add_command(label="New", accelerator="Ctrl+N", command=new)
 
root.bind("<Control-n>", new)

Menu的菜单分割线

add_separator方法
add_separator方法可以给菜单添加一条分割线


menubar = Menu(tk)
tk.config(menu=menubar)
 
fm = Menu(menu, tearoff=False)
menu.add_cascade(label="File", menu=fm)
 
fm.add_command(label="New File")
fm.add_command(label="Save")
fm.add_separator() #添加分割线
fm.add_command(label="Exit")

Menu的菜单快捷触发

underline参数指定一个索引,绑定一个Alt快捷键。指定了underline的菜单项可以快捷触发。触发方式是:先按下Alt,然后下划线会显示出来,再按下菜单项标签下划线上的字符即可执行这个菜单项

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。

menu = Menu(root)
 
def show(event):
    menu.post(event.x_root, event.y_root)
    
def cp():
    print("Copy")
 
menu.add_command(label="Copy", underline=0, command=cp)
 
root.bind("<Button-3>", show)

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
root = Tk()
 
lb = Listbox(root)
lb.pack()
虚拟事件<>
lb = Listbox(root)
lb.pack()
 
for n in range(20):
    lb.insert("end", n)
 
def select(event):
    print(lb.curselection()) #打印选中项的索引
    
lb.bind("<<ListboxSelect>>", select)

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

orient参数
orient参数指定滚动条的朝向。部分组件也有这个方法,都有两个可选值:“horizontal”(水平,横向), “vertical”(垂直,竖向)

sb = Scrollbar(root)
sb.pack(side="right", fill="y")
 
lb = Listbox(root, yscrollcommand=sb.set)
lb.pack(side="left", fill="both")
for i in range(100):
    lb.insert("end", i)
 
sb.config(command=lb.yview)

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HACKNOE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值