python之Tkinter使用详解

一、前言

  • *Tkinter是什么

Tkinter是Python标准库中的一个GUI(Graphical User Interface,图形用户界面)工具包,其目的是为Python开发者提供快捷创建GUI应用程序的方式。

Tkinter基于Tcl/Tk图形库,允许我们使用Python代码来创建和管理窗口、标签、按钮、复选框、文本框、列表框、滚动条、画布、菜单等多种控件和组件。 Tkinter对多数平台都有良好的支持,而无需安装额外的软件或库。

通过Tkinter编写的GUI程序可以运行在像Windows、Mac OS X和Linux这样广泛流行的操作系统上,并允许用户与程序进行交互操作。 Tkinter提供了简单易懂的API,可以使得初学者也可以迅速学会如何构建Python GUI应用程序。

二、Tkinter创建窗口

2.1、创建窗口

  • 首先我们导入tkinter的库
import tkinter as tk
root = tk.Tk()

如果只是执行以上的两句代码,运行程序是没有反应的,因为只有一个主函数,从上到下执行完就没有了,这个窗口也是很快就消失了,所以现在我们要做的就是让窗口一直显示,那么我们就可以加一个循环

  • 创建的窗口的名字是root ,那么我们之后使用这个root就可以操作这个窗口了。
root.mainloop()

执行以上的3句代码,我们就可以看见窗口了

python之Tkinter使用详解

2.2、窗口标题

root.title('演示窗口')

python之Tkinter使用详解

2.3、窗口设置

  • 通过以下代码,我们可以给窗口设置宽高以及窗口在屏幕的位置
root.geometry("300x100+630+80")

python之Tkinter使用详解

2.3、创建按钮,并且给按钮添加点击事件

  • 这个库里面有一个方法Button(),只要调用这个方法,我们就可以创建这个组件,创建的这个组件我们赋值给一个常量,以后我们就可以用这个常量来操作这个按钮,这个方法里面的参数,就是要我们写窗口的名字
  • Button(root) 这样写的意思就是 将我们创建的按钮放到这个窗口上面
btn1 = tk.Button(root)
  • 给按钮取一个名称
btn1["text"] = "点击"
  • 我们创建的按钮组件,已经放到窗口里面了,但是放到窗口的哪个位置,东南西北哪个地方,我们就可以用pack()去定位(后面会介绍其它定位方法)
btn1.pack()
  • 创建点击按钮事件的弹窗,先导入messagebox,这个必须单独导入
from tkinter import messagebox
def test(e):
    messagebox.showinfo("窗口名称","点击成功")
  • 现在有了按钮,有了方法,我想要做的是一点击按钮,就执行这个方法,那么就需要将按钮和方法进行绑定
btn1.bind("",test)

按钮组件里面有一个方法bind() 这个方法就可以实现绑定

  • 完整代码
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title('演示窗口')
root.geometry("300x100+630+80")

btn1 = tk.Button(root)
btn1["text"] = "点击"
btn1.pack()

def test(e):
    '''创建弹窗'''
    messagebox.showinfo("窗口名称", "点击成功")

btn1.bind("", test)
root.mainloop()

python之Tkinter使用详解

三、组件布局及样式

3.1、组件布局

  • 3种布局管理器:pack – grid – place
pack
这个布局管理器,要么将组件垂直的排列,要么水平的排列
grid
Grid(网格)布局管理器会将控件放置到一个二维的表格里。
主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。

选项说明column单元格的列号,从0开始的正整数columnspan跨列,跨越的列数,正整数row单元格的行号, 从0开始的正整数rowspan跨行,跨越的行数,正整数ipadx, ipady设置子组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0padx, pady与之并列的组件之间的间隔,x方向或y方向,默认单位为像素,非浮点数,默认0.0sticky组件紧贴所在的单元格的某一脚,对应于东南西北中以及4个角。东 = “e”,南=”s”,西=”w”,北=”n”,”ne”,”se”,”sw”, “nw”;

  • grid_info() 查看组件默认的参数
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid()
print(btn1.grid_info())

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解
  • column 指定控件所在的列
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(column=0)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python之Tkinter使用详解
  • columnspan 指定每个控件横跨的列数
  • 什么是columnspan?

类似excel的合并单元格

python之Tkinter使用详解
a占了两个格子的宽度,colunmspan就是2
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(column=0, columnspan=2)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1, columnspan=1)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python之Tkinter使用详解
  • row 指定控件所在的行
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(row=0)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=1)

btn3 = tk.Button(root)
btn3["text"] = "按钮2"
btn3.grid(row=2)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python之Tkinter使用详解
  • rowspan 指定每个控件横跨的行数
  • 什么是rowspan ?

类似excel的合并单元格

python之Tkinter使用详解
a占了两个格子的高度,rowspan就是2
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(row=0, rowspan=2)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=2, rowspan=1)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python之Tkinter使用详解
  • ipadx 水平方向内边距
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(ipadx=20)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(ipadx=5)

root.title('演示窗口')
root.geometry("300x100+1000+300")
root.mainloop()

python之Tkinter使用详解
  • ipady 垂直方向内边距
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(ipady=20)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(ipady=5)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解
  • padx 水平方向外边距
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(padx=50)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(column=1, padx=20)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解
  • pady 垂直方向外边距
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "按钮1"
btn1.grid(pady=30)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(pady=20)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解
  • sticky 组件东南西北的方向
import tkinter as tk
root = tk.Tk()

btn1 = tk.Button(root)
btn1["text"] = "默认按钮演示效果"
btn1.grid(ipadx=50)

btn2 = tk.Button(root)
btn2["text"] = "按钮2"
btn2.grid(row=1, sticky="w")

btn3 = tk.Button(root)
btn3["text"] = "按钮3"
btn3.grid(row=1, sticky="e")

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解
place布局管理器
place布局管理器可以通过坐标精确控制组件的位置,适用于一些布局更加灵活的场景

选项说明x,y组件左上角的绝对坐标(相当于窗口)relx ,rely组件左上角的坐标(相对于父容器)width , height组件的宽度和高度relwidth , relheight组件的宽度和高度(相对于父容器)anchor对齐方式,左对齐”w”,右对齐”e”,顶对齐”n”,底对齐”s”

import tkinter as tk
root = 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()

python之Tkinter使用详解

3.2、组件文字字体、字号、字体粗细、颜色设置

import tkinter.font as font
import tkinter as tk

root = tk.Tk()
'''
family:指定字体名称
size:指定字体大小
weight:指定字体的粗细程度
'''
font_1 = font.Font(family='Helvetica', size=30, weight='normal')
font_2 = font.Font(family='Arial', size=15, weight='bold')

but1 = tk.Button(root, text="背景色", font=font_1, bg="LightSkyBlue")
but1.grid(row=0, column=0)

Label1 = tk.Label(root, text="文字颜色", font=font_2, foreground="Orange")
Label1.grid(row=0, column=2)

root.title('演示窗口')
root.geometry("300x150+1000+300")
root.mainloop()

python之Tkinter使用详解

四、Tkinter基本控件介绍

4.1、封装

import tkinter as tk

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        pass

if __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


    def interface(self):
        """"界面编写位置"""
        self.w1 = tk.Text(self.root, width=80, height=10)
        self.w1.pack(pady=0, padx=30)

    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='',
            cursor='arrow',
            font=('', 15),
            textvariable='',
            values=values,
            )
        self.combobox.grid(padx=150)

4.9、菜单-主菜单、子菜单

import tkinter as tk
from tkinter import Menu

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")

        self.menubar = Menu(self.root)

        self.root.config(menu=self.menubar)
        self.interface()

    def interface(self):
        """"界面编写位置"""

        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 amenu

if __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, padx=20)

        self.Button1 = tk.Button(self.root, text="确定", command=lambda: self.parameter('测试'))
        self.Button1.grid(row=0, column=1, padx=20)

        self.Button2 = tk.Button(self.root, text="退出", command=self.root.destroy, bg="Gray")
        self.Button2.grid(row=0, column=2, padx=20)

    def event(self):
        """按钮事件"""
        print("运行成功")

    def parameter(self, data):
        """传入参数"""
        print(f"获取到的参数: {data}")

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.3、文本输入框(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.4、获取复选按钮(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.5、清除控件

    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.6、清除复选框勾选状态

    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.7、文本框(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.8、下拉选择框绑定事件

    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='',
            cursor='arrow',
            font=('', 15),
            textvariable=self.value,
            values=values,
            )

        self.combobox.bind("<>", self.pick)
        self.combobox.grid(padx=150)

    def pick(self, *args):
        print('选中的数据:{}'.format(self.combobox.get()))
        print('value的值:{}'.format(self.value.get()))

5.9、手动选择颜色

import tkinter as tk
from tkinter import colorchooser

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.get_colors)
        self.Button0.grid(row=0, column=1)

        self.w1 = tk.Text(self.root, width=68, height=10)
        self.w1.grid(row=1, column=0, columnspan=3, padx=10)

    def get_colors(self):
        '''手动选择颜色, 并获取颜色代码'''
        color_code = colorchooser.askcolor()

        self.w1.grid_forget()

        self.w1 = tk.Text(self.root, width=68, height=10, bg=color_code[1])
        self.w1.grid(row=1, column=0, columnspan=3, padx=10)

        self.w1.insert("insert", color_code)

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

5.10、选择文件和文件另存

import tkinter as tk
from tkinter import filedialog
import pandas as pd

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.single_file)
        self.Button0.grid(row=0, column=0)

        self.Button1 = tk.Button(self.root, text="选择多个文件", command=self.multiple_files)
        self.Button1.grid(row=0, column=1)

        self.Button2 = tk.Button(self.root, text="保存文件", command=self.save_file)
        self.Button2.grid(row=0, column=2)

        self.w1 = tk.Text(self.root, width=68, height=10)
        self.w1.grid(row=1, column=0, columnspan=3, padx=10)

    def single_file(self):
        '''获取单个文件'''
        file_path = filedialog.askopenfilename()
        self.w1.insert("insert", file_path)

    def multiple_files(self):
        '''获取多个文件'''
        file_path = filedialog.askopenfilenames()
        self.w1.insert("insert", file_path)

    def save_file(self):
        '''保存文件'''

        file_name = filedialog.asksaveasfilename(title='保存为', filetypes=[("csv", ".csv")])

        filename = file_name+'.csv'
        csvfile = open(filename, 'w')
        name = ['姓名', '年龄', '电话']
        list1 = [
            ('王明', '25', '12345678'),
            ('张三', '18', '87654321')
            ]
        save = pd.DataFrame(columns=name, data=list1)
        save.to_csv(filename)

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

5.11、日期选择模块

PyInstaller打包说明:
    如果使用了日期选择模块"tkcalendar.DateEntry",打包是必须加上"--hidden-import babel.numbers"
    pyinstaller --hidden-import babel.numbers myscript.py
    或通过编辑.spec文件
    hiddenimports=["babel.numbers"]

import tkinter as tk
import datetime
from tkcalendar import DateEntry

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x230+1100+150")
        self.interface()

    def interface(self):
        """"界面编写位置"""
        self.Label0 = tk.Label(self.root, text="日期选择")
        self.Label0.grid(row=0, padx=210)

        date = datetime.datetime.now().strftime('%Y-%m-%d')
        date_print = date.split("-")

        self.date = DateEntry(self.root,
                              date_pattern='yyyy-mm-dd',
                              width=12,
                              year=int(date_print[0]),
                              month=int(date_print[1]),
                              day=int(date_print[2]),
                              background='skyblue',
                              foreground='white',
                              borderwidth=2)
        self.date.grid(row=1, padx=210)

        self.Button0 = tk.Button(self.root, text="运行", command=self.event)
        self.Button0.grid(row=2, column=0, ipadx=10, padx=10)

        self.w1 = tk.Text(self.root, width=50, height=10)
        self.w1.grid(row=3, column=0)

    def event(self):

        self.w1.insert(1.0, f"日期打印:{self.date.get()}\n")

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

5.12、子菜单绑定事件

import tkinter as tk
from tkinter import filedialog
from tkinter import Menu

class GUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('演示窗口')
        self.root.geometry("500x200+1100+150")

        self.menubar = Menu(self.root)

        self.root.config(menu=self.menubar)
        self.interface()

    def interface(self):
        """"界面编写位置"""

        self.menubar.add_cascade(label="文件", menu=self.papers())
        self.menubar.add_cascade(label="查看", menu=self.about())

        self.w1 = tk.Text(self.root, width=68, height=10)
        self.w1.grid(row=1, column=0, columnspan=3, padx=10)

    def papers(self):
        fmenu = Menu(self.menubar, tearoff=0)

        fmenu.add_command(label="打开文件", command=self.open_file)

        return fmenu

    def about(self):
        amenu = Menu(self.menubar, tearoff=0)

        self.V1 = tk.IntVar()

        amenu.add_checkbutton(label="文件扩展名", variable=self.V1, command=self.show_extension)

        return amenu

    def open_file(self):
        file_path = filedialog.askopenfilename()
        self.w1.insert("insert", file_path)

    def show_extension(self):
        if self.V1.get() == 1:
            self.w1.delete(1.0, "end")
            self.w1.insert("insert", "显示文件扩展名\n")
        else:
            self.w1.delete(1.0, "end")
            self.w1.insert("insert", "隐藏文件扩展名\n")

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

六、Tkinter使用多线程

6.1、为什么要使用多线程

  • 以下为单线程运行
import tkinter as tk

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.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')

if __name__ == '__main__':
    a = GUI()
    a.root.mainloop()

单线程下,主线程需要运行窗口,如果这个时候点击”确定”按钮,主线程就会去执行event方法,那界面就会出现”无响应”状态,如果要界面正常显示,那我们就需要用到多线程(threading)

python之Tkinter使用详解
threading语法:

`python
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

Original: https://blog.csdn.net/qq_45664055/article/details/117625146
Author: 檬柠wan
Title: python之Tkinter使用详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/723403/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球