【相关推荐:python3视频教程 】
一、前言1.1、tkinter是什么
tkinter 是使用 python 进行窗口视窗设计的模块。tkinter模块(“tk 接口”)是python的标准tk gui工具包的接口。作为 python 特定的gui界面,是一个图像的窗口,tkinter是python自带的,可以编辑的gui界面,用来入门,熟悉窗口视窗的使用,非常有必要。二、准备工作2.1、windows演示环境搭建
安装python3.7安装编辑器,演示使用的visual studio code三、tkinter创建窗口3.1、创建出一个窗口
首先我们导入tkinter的库import tkinter as tk # 在代码里面导入库,起一个别名,以后代码里面就用这个别名root = tk.tk() # 这个库里面有tk()这个方法,这个方法的作用就是创建一个窗口
如果只是执行以上的两句代码,运行程序是没有反应的,因为只有一个主函数,从上到下执行完就没有了,这个窗口也是很快就消失了,所以现在我们要做的就是让窗口一直显示,那么我们就可以加一个循环
创建的窗口的名字是root ,那么我们之后使用这个root就可以操作这个窗口了。root.mainloop() # 加上这一句,就可以看见窗口了
执行以上的3句代码,我们就可以看见窗口了
3.2、给窗口取一个标题
root.title('演示窗口')
3.3、窗口设置
通过以下代码,我们可以给窗口设置长宽以及窗口在屏幕的位置root.geometry(300x100+630+80) # 长x宽+x*y
3.3、创建按钮,并且给按钮添加点击事件
这个库里面有一个方法button(),只要调用这个方法,我们就可以创建这个组件,创建的这个组件我们赋值给一个常量,以后我们就可以用这个常量来操作这个按钮,这个方法里面的参数,就是要我们写窗口的名字button(root) 这样写的意思就是 将我们创建的按钮放到这个窗口上面btn1 = tk.button(root)
给按钮取一个名称btn1[text] = 点击
我们创建的按钮组件,已经放到窗口里面了,但是放到窗口的哪个位置,东南西北哪个地方,我们就可以用pack()去定位(后面会介绍其它定位方法)btn1.pack() # 按钮在窗口里面的定位
创建点击按钮事件的弹窗,先导入messagebox,这个必须单独导入from tkinter import messageboxdef test(e): messagebox.showinfo(窗口名称,点击成功)
现在有了按钮,有了方法,我想要做的是一点击按钮,就执行这个方法,那么就需要将按钮和方法进行绑定btn1.bind(<button-1>,test) #第一个参数为:按鼠标左键的事件 第二个参数为:要执行的方法的名字
按钮组件里面有一个方法bind() 这个方法就可以实现绑定
完整代码import tkinter as tkfrom tkinter import messageboxroot = tk.tk() # 创建窗口root.title('演示窗口')root.geometry(300x100+630+80) # 长x宽+x*ybtn1 = tk.button(root) # 创建按钮,并且将按钮放到窗口里面btn1[text] = 点击 # 给按钮一个名称btn1.pack() # 按钮布局def test(e): '''创建弹窗''' messagebox.showinfo(窗口名称, 点击成功)btn1.bind(<button-1>, test) # 将按钮和方法进行绑定,也就是创建了一个事件root.mainloop() # 让窗口一直显示,循环
3.4、窗口内的组件布局
3种布局管理器:pack - grid - placepack 这个布局管理器,要么将组件垂直的排列,要么水平的排列
grid grid(网格)布局管理器会将控件放置到一个二维的表格里。主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。
选项说明
column 单元格的列号,从0开始的正整数
columnspan 跨列,跨越的列数,正整数
row 单元格的行号, 从0开始的正整数
rowspan 跨行,跨越的行数,正整数
ipadx, ipady 设置子组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0
padx, pady 与之并列的组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0
sticky 组件紧贴所在的单元格的某一脚,对应于东南西北中以及4个角。东 = “e”,南=“s”,西=“w”,北=“n”,“ne”,“se”,“sw”, “nw”;
grid_info() 查看组件默认的参数import tkinter as tkroot = tk.tk()# 默认按钮btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid()print(btn1.grid_info())root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
column 指定控件所在的列import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(column=0)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(column=1)root.title('演示窗口')root.geometry(300x100+1000+300)root.mainloop()
columnspan 指定每个控件横跨的列数什么是columnspan?类似excel的合并单元格
a占了两个格子的宽度,colunmspan就是2
pythonimport tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(column=0, columnspan=2)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(column=1, columnspan=1)root.title('演示窗口')root.geometry(300x100+1000+300)root.mainloop()
row 指定控件所在的行import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(row=0)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(row=1)# 按钮3btn3 = tk.button(root)btn3[text] = 按钮2btn3.grid(row=2)root.title('演示窗口')root.geometry(300x100+1000+300)root.mainloop()
rowspan 指定每个控件横跨的行数
什么是rowspan ?
类似excel的合并单元格
a占了两个格子的高度,rowspan就是2
import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(row=0, rowspan=2)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(row=2, rowspan=1)root.title('演示窗口')root.geometry(300x100+1000+300)root.mainloop()
ipadx 水平方向内边距import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(ipadx=20)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(ipadx=5)root.title('演示窗口')root.geometry(300x100+1000+300)root.mainloop()
ipady 垂直方向内边距import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(ipady=20)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(ipady=5)root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
padx 水平方向外边距import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(padx=50)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(column=1, padx=20)root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
pady 垂直方向外边距import tkinter as tkroot = tk.tk()# 按钮1btn1 = tk.button(root)btn1[text] = 按钮1btn1.grid(pady=30)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(pady=20)root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
sticky 组件东南西北的方向import tkinter as tkroot = tk.tk()# 默认按钮btn1 = tk.button(root)btn1[text] = 默认按钮演示效果btn1.grid(ipadx=50)# 按钮2btn2 = tk.button(root)btn2[text] = 按钮2btn2.grid(row=1, sticky=w)# 按钮3btn3 = tk.button(root)btn3[text] = 按钮3btn3.grid(row=1, sticky=e)root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
place布局管理器place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景
选项说明
x,y 组件左上角的绝对坐标(相当于窗口)
relx ,rely 组件左上角的坐标(相对于父容器)
width , height 组件的宽度和高度
relwidth , relheight 组件的宽度和高度(相对于父容器)
anchor 对齐方式,左对齐“w”,右对齐“e”,顶对齐“n”,底对齐“s”
import tkinter as tkroot = tk.tk()but1 = tk.button(root, text=按钮1)but1.place(relx=0.2, x=100, y=20, relwidth=0.2, relheight=0.5)root.title('演示窗口')root.geometry(300x150+1000+300)root.mainloop()
四、tkinter基本控件介绍4.1、封装
import tkinter as tk# from tkinter import ttk -下拉选择框class gui: def __init__(self): self.root = tk.tk() self.root.title('演示窗口') self.root.geometry(500x200+1100+150) self.interface() def interface(self): 界面编写位置 passif __name__ == '__main__': a = gui() a.root.mainloop()
4.2、文本显示_label
def interface(self): 界面编写位置 self.label0 = tk.label(self.root, text=文本显示) self.label0.grid(row=0, column=0)
4.3、按钮显示_button
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=按钮显示) self.button0.grid(row=0, column=0)
4.4、输入框显示_entry
def interface(self): 界面编写位置 self.entry0 = tk.entry(self.root) self.entry0.grid(row=0, column=0)
4.5、文本输入框显示_text
# pack布局 def interface(self): 界面编写位置 self.w1 = tk.text(self.root, width=80, height=10) self.w1.pack(pady=0, padx=30)# grid布局 def interface(self): 界面编写位置 self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=1, column=0)
4.6、复选按钮_checkbutton
def interface(self): 界面编写位置 self.checkbutton01 = tk.checkbutton(self.root, text=名称) self.checkbutton01.grid(row=0, column=2)
4.7、单选按钮_radiobutton
def interface(self): 界面编写位置 self.radiobutton01 = tk.radiobutton(self.root, text=名称) self.radiobutton01.grid(row=0, column=2)
4.8、下拉选择框_combobox
def interface(self): 界面编写位置 values = ['1', '2', '3', '4'] self.combobox = ttk.combobox( master=self.root, # 父容器 height=10, # 高度,下拉显示的条目数量 width=20, # 宽度 state='', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled(禁止输入选择) cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus... font=('', 15), # 字体、字号 textvariable='', # 通过stringvar设置可改变的值 values=values, # 设置下拉框的选项 ) self.combobox.grid(padx=150)
4.9、菜单-主菜单、子菜单
import tkinter as tkfrom tkinter import menuclass gui: def __init__(self): self.root = tk.tk() self.root.title('演示窗口') self.root.geometry(500x200+1100+150) # 创建主菜单实例 self.menubar = menu(self.root) # 显示菜单,将root根窗口的主菜单设置为menu self.root.config(menu=self.menubar) self.interface() def interface(self): 界面编写位置 # 在 menubar 上设置菜单名,并关联一系列子菜单 self.menubar.add_cascade(label=文件, menu=self.papers()) self.menubar.add_cascade(label=查看, menu=self.about()) def papers(self): fmenu = menu(self.menubar): 创建子菜单实例 tearoff=1: 1的话多了一个虚线,如果点击的话就会发现,这个菜单框可以独立出来显示 fmenu.add_separator(): 添加分隔符-------- fmenu = menu(self.menubar, tearoff=0) # 创建单选框 for item in ['新建', '打开', '保存', '另存为']: fmenu.add_command(label=item) return fmenu def about(self): amenu = menu(self.menubar, tearoff=0) # 添加复选框 for item in ['项目复选框', '文件扩展名', '隐藏的项目']: amenu.add_checkbutton(label=item) return amenuif __name__ == '__main__': a = gui() a.root.mainloop()
五、组件使用方法介绍5.1、按钮(button)绑定事件
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=运行, command=self.event) self.button0.grid(row=0, column=0) self.button1 = tk.button(self.root, text=退出, command=self.root.destroy, bg=gray) # bg=颜色 self.button1.grid(row=0, column=1, sticky=e, ipadx=10) def event(self): 按钮事件 print(运行成功)
5.2、输入框(entry)内容获取
def interface(self): 界面编写位置 self.entry00 = tk.stringvar() self.entry00.set(默认信息) self.entry0 = tk.entry(self.root, textvariable=self.entry00) self.entry0.grid(row=1, column=0) self.button0 = tk.button(self.root, text=运行, command=self.event) self.button0.grid(row=0, column=0) def event(self): 按钮事件,获取文本信息 a = self.entry00.get() print(a)
5.2、文本输入框(text),写入文本信息和清除文本信息
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=清除, command=self.event) self.button0.grid(row=0, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=1, column=0) self.w1.insert(insert, 默认信息) def event(self): '''清空输入框''' self.w1.delete(1.0, end)
5.3、获取复选按钮(checkbutton)的状态
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.event) self.button0.grid(row=0, column=0) self.v1 = tk.intvar() self.checkbutton01 = tk.checkbutton(self.root, text=复选框, command=self.check_box, variable=self.v1) self.checkbutton01.grid(row=1, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=2, column=0) def event(self): '''按钮事件,获取复选框的状态,1表示勾选,0表示未勾选''' a = self.v1.get() self.w1.insert(1.0, str(a)+'\n') def check_box(self): '''复选框事件''' if self.v1.get() == 1: self.w1.insert(1.0, 勾选+'\n') else: self.w1.insert(1.0, 未勾选+'\n')
5.4、清除控件
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.event) self.button0.grid(row=0, column=0) self.label0 = tk.label(self.root, text=文本显示) self.label0.grid(row=1, column=0) self.entry0 = tk.entry(self.root) self.entry0.grid(row=2, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=3, column=0) def event(self): '''按钮事件,清除label、entry、text组件''' a = [self.label0, self.entry0, self.w1] for i in a: i.grid_forget()
5.5、清除复选框勾选状态
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.event) self.button0.grid(row=0, column=0) self.v1 = tk.intvar() self.checkbutton01 = tk.checkbutton(self.root, text=复选框, command=self.check_box, variable=self.v1) self.checkbutton01.grid(row=1, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=2, column=0) def event(self): '''按钮事件,清除复选框勾选状态''' self.checkbutton01.deselect() def check_box(self): '''复选框事件''' if self.v1.get() == 1: self.w1.insert(1.0, 勾选+'\n') else: self.w1.insert(1.0, 未勾选+'\n')
5.6、文本框(text)内容获取
def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.event) self.button0.grid(row=0, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=1, column=0) def event(self): a = self.w1.get('0.0', 'end') print(a)
5.7、下拉选择框绑定事件
def interface(self): 界面编写位置 self.value = tk.stringvar() self.value.set('2') # 默认值 values = ['1', '2', '3', '4'] self.combobox = ttk.combobox( master=self.root, # 父容器 height=10, # 高度,下拉显示的条目数量 width=20, # 宽度 state='', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled(禁止输入选择) cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus... font=('', 15), # 字体 textvariable=self.value, # 通过stringvar设置可改变的值 values=values, # 设置下拉框的选项 ) # 绑定事件,下拉列表框被选中时,绑定pick()函数 self.combobox.bind(<<comboboxselected>>, self.pick) self.combobox.grid(padx=150) def pick(self, *args): # 处理事件,*args表示可变参数 print('选中的数据:{}'.format(self.combobox.get())) print('value的值:{}'.format(self.value.get()))
六、tkinter使用多线程6.1、为什么要使用多线程
以下为单线程运行 def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.event) self.button0.grid(row=0, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=1, column=0) def event(self): '''按钮事件,一直循环''' a = 0 while true: a += 1 self.w1.insert(1.0, str(a)+'\n')
单线程下,主线程需要运行窗口,如果这个时候点击“确定”按钮,主线程就会去执行event方法,那界面就会出现“无响应”状态,如果要界面正常显示,那我们就需要用到多线程(threading)
多线程,完整代码import tkinter as tkimport threading # 导入多线程模块class gui: def __init__(self): self.root = tk.tk() self.root.title('演示窗口') self.root.geometry(500x200+1100+150) self.interface() def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定, command=self.start) self.button0.grid(row=0, column=0) self.w1 = tk.text(self.root, width=80, height=10) self.w1.grid(row=1, column=0) def event(self): '''按钮事件,一直循环''' a = 0 while true: a += 1 self.w1.insert(1.0, str(a)+'\n') def start(self): self.t = threading.thread(target=self.event) # 多线程 self.t.setdaemon(true) # 线程守护,即主进程结束后,此线程也结束。否则主进程结束子进程不结束 self.t.start() # 启动if __name__ == '__main__': a = gui() a.root.mainloop()
七、tkinter多线程暂停和继续import tkinter as tkimport threadingfrom time import sleepevent = threading.event()class gui: def __init__(self): self.root = tk.tk() self.root.title('演示窗口') self.root.geometry(500x200+1100+150) self.interface() def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=启动, command=self.start) self.button0.grid(row=0, column=0) self.button0 = tk.button(self.root, text=暂停, command=self.stop) self.button0.grid(row=0, column=1) self.button0 = tk.button(self.root, text=继续, command=self.conti) self.button0.grid(row=0, column=2) self.w1 = tk.text(self.root, width=70, height=10) self.w1.grid(row=1, column=0, columnspan=3) def event(self): '''按钮事件,一直循环''' while true: sleep(1) event.wait() self.w1.insert(1.0, '运行中'+'\n') def start(self): event.set() self.t = threading.thread(target=self.event) self.t.setdaemon(true) self.t.start() def stop(self): event.clear() self.w1.insert(1.0, '暂停'+'\n') def conti(self): event.set() self.w1.insert(1.0, '继续'+'\n')if __name__ == '__main__': a = gui() a.root.mainloop()
八、tkinter文件之间的调用8.1、准备工作
a.py文件 - -界面逻辑+线程b.py 文件 - -业务逻辑以上文件在同一个目录下8.2、方法
# a.py 文件import tkinter as tkimport threadingfrom b import logic # 调用b文件中的logic类class gui: def __init__(self): self.root = tk.tk() self.root.title('演示窗口') self.root.geometry(500x260+1100+150) self.interface() def interface(self): 界面编写位置 self.button0 = tk.button(self.root, text=确定执行, command=self.start, bg=#7bbfea) self.button0.grid(row=0, column=1, pady=10) self.entry00 = tk.stringvar() self.entry00.set() self.entry0 = tk.entry(self.root, textvariable=self.entry00) self.entry0.grid(row=1, column=1, pady=15) self.w1 = tk.text(self.root, width=50, height=8) self.w1.grid(row=2, column=0, columnspan=3, padx=60) def seal(self): '''把b文件的类单独写一个方法''' a = self.entry00.get() w1 = self.w1 logic().event(a, w1) def start(self): '''子线程无法直接执行b的类,需要把b文件单独写一个方法,然后执行''' self.t = threading.thread(target=self.seal) self.t.setdaemon(true) self.t.start()if __name__ == '__main__': a = gui() a.root.mainloop()
# b.py 文件import timeclass logic(): def __init__(self): pass def main(self, a, x): while true: y = int(a)+int(x) self.w1.insert(1.0, str(y)+'\n') time.sleep(1) x += 1 def event(self, a, w1): '''调用main的方法''' self.w1 = w1 x = 1 self.main(a, x)
【相关推荐:python3视频教程 】
以上就是一文搞懂python中tkinter的使用的详细内容。
