python+tkinter可视化GUI方式

 更新时间:2026年04月13日 10:13:55   作者:吾名招财  
文章介绍了使用Python的tkinter库创建GUI窗口的过程,包括窗口和标签的定义、Entry和Text控件的基本属性和使用方法、网格布局的应用、按钮绑定事件和弹窗的使用、Combox下拉框的添加、控件属性值的获取和更改,以及tkinter自带的剪切板操作

1.创建窗口

import tkinter as tk    #导入tk
if __name__ == '__main__':
    root = tk.Tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    root.mainloop()                  #无限循环,不断更新页面

2.窗口的定义和label的使用

一般的编写方式如何

一般会声明一个类

3.Label、Entry、Text的基本属性和使用

标签、编辑框、文本框

(1)标签

标签的基本参数如下

(2)编辑框

(3)文本框

#-*- codeing = utf-8 -*- 
#@Time : 2020/12/28 9:43
#@Author : 招财进宝
#@File : _int_.py
#@Software: PyCharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.Label()等方法时,可直接Label()

class Application(tk.Frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.StringVar(None, '123')

        self.intwind()              #调用窗口函数

    #创建窗口控件
    def intwind(self):
        #以下的每个控件都要pack
        Label(self,text='123',fg='red',bg='green',width=50).pack()       #传入文本123,文字颜色红色,背景绿色,所占50个字的宽度
        Entry(self,textvariable=self.envar,fg='#888',bg='#ff0',width=10).pack()     #编辑框

        text = Text(self,fg='#ff0',bg='#000',width=20)                       #初始化一个文本控件对象
        text.pack()                             #在此处pack,pack后返回的值是none
        text.insert('end','111')                #在末尾插入文字123
        text.insert('end', '222')
        text.insert('1.4', '555')               #在第1行第4列插入数字
        text.insert('1.8', '333')               #此处指定位置插入成功
        text.insert('2.1', '444')              #当输入2.X或者0.X时,都是插入最后面,原因可能是只有一行,无换行
        text.insert('1.13', '666')


if __name__ == '__main__':
    root = tk.Tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = Application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

4.网格布局讲解

前面的排版都是以数列进行排版的,即一行一行的排版

这里使用grid函数,而不是使用pack函数了。

#-*- codeing = utf-8 -*- 
#@Time : 2020/12/28 9:43
#@Author : 招财进宝
#@File : _int_.py
#@Software: PyCharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.Label()等方法时,可直接Label()

class Application(tk.Frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.StringVar(None, '123')

        self.intwind()              #调用窗口函数

    #创建窗口控件
    def intwind(self):
        #以下的每个控件都要pack
        Label(self,text='123',fg='red',bg='green',width=2).grid(row=0,column=0)       #传入文本123,文字颜色红色,背景绿色,所占50个字的宽度
        Entry(self,textvariable=self.envar,fg='#888',bg='#ff0',width=10).grid(row=0,column=1)     #编辑框

        text = Text(self,fg='#ff0',bg='#000',width=20)                       #初始化一个文本控件对象
        #text.grid(columnspan=2,rowspan=2,pady=20,padx=50)               #合并两列,可达到居中的效果
        text.grid(columnspan=2, rowspan=2, ipadx=50)                        #ipadx会向外扩展,而padx会向里缩
        text.insert('end','111')                #在末尾插入文字123
        text.insert('end', '222')
        text.insert('1.4', '555')               #在第1行第4列插入数字
        text.insert('1.8', '333')               #此处指定位置插入成功
        text.insert('2.1', '444')              #当输入2.X或者0.X时,都是插入最后面,原因可能是只有一行,无换行
        text.insert('1.13', '666')


if __name__ == '__main__':
    root = tk.Tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = Application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

5.丰富窗口编写一个简单的窗口

编写一个类似下方框架的窗口

发现有两个横向组成,此时使用frame进行框架的布局,若直接单个控件的添加,不太好管理

6.创建按钮绑定事件和弹窗的使用

#-*- codeing = utf-8 -*- 
#@Time : 2020/12/28 9:43
#@Author : 招财进宝
#@File : _int_.py
#@Software: PyCharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.Label()等方法时,可直接Label()
from tkinter import messagebox      #此处引入messagebox,尽管之前引入*全部了但找不到

class Application(tk.Frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.StringVar(None, '123')          #用于编辑框的文本信息输入
        #root.geometry('250x145')                        #设置窗口的大小
        root.minsize(250,145)                           #设置窗口的最小值
        root.maxsize(250, 145)                          #设置窗口的最大值
        root.title('登录')                            #设置窗口的名称
        #root.iconbitmap()                             #设置图标,必须是ico格式的
        self.username = tk.StringVar()  # 用于编辑框的文本信息输入,此处注意在前方要引入from tkinter import messagebox
        self.password = tk.StringVar()  # 用于编辑框的文本信息输入

        self.intwind()              #调用窗口函数

    def buttonActive(self):
        u = self.username.get()             #得到编辑框中的内容
        p = self.password.get()
        if len(u)==0 or len(p)==0:
            messagebox.showinfo('提示:','请完整信息')
            return
        messagebox.showinfo('提示:', '你输入的账号:%s\n密码:%s'%(u,p))

    #创建窗口控件
    def intwind(self):
        frame1 = Frame(self)
        Label(frame1,text='账号:').grid(row=0,column=0)
        Entry(frame1,textvariable=self.username).grid(row=0,column=1)

        frame2 = Frame(self)
        Label(frame2, text='密码:').grid(row=0, column=0)
        Entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

        frame1.grid(pady=15)
        frame2.grid()

        Button(self,text='登录',width=12,command=self.buttonActive).grid(pady=10)
        
if __name__ == '__main__':
    root = tk.Tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = Application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

7.下拉框Combox的使用

添加下拉框可以选择是管理员还是普通成员的登录方式

但是上方并没有进行默认选择

8.获取或更改控件的属性值

#创建窗口控件
def intwind(self):
    frame1 = Frame(self)
    Label(frame1,text='账号:').grid(row=0,column=0)
    Entry(frame1,textvariable=self.username).grid(row=0,column=1)

    frame2 = Frame(self)
    Label(frame2, text='密码:').grid(row=0, column=0)
    Entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

    frame3 = Frame(self)
    Label(frame3, text='身份:').grid(row=0, column=0)
    self.selector = ttk.Combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
    self.selector.grid(row=0, column=1)
    self.selector.current(0)
    self.selector.bind('<<ComboboxSelected>>',self.selectorLinstener)      #绑定一个监听事件/函数,用来监听选择的

    frame3.grid(pady=6)                 #将身份的模块放到最开始显示
    frame1.grid(pady=10)
    frame2.grid()

    btn = Button(self,text='登录',width=12,command=self.buttonActive)
    btn.grid(pady=10)

    # 此处获取控件的属性的方法(cget()),所有控件都支持
    print(self.selector.cget('values'))             #获取下拉框的属性values
    print(self.selector.cget('width'))              #获取下拉框的属性width

    #使用config获取属性或者更改属性
    # self.selector.config(values=[1,2])      #重新配置属性values的值
    # self.selector.current(0)                #设置选择的当前值
    
    #使用字典键值对的方式获取属性值,或者更改属性值
    self.selector['values']=[1,2]             #此处的属性的设置相当于上面的

    print(btn['text'])                  #获取上一个按钮控件的属性值,打印
    btn['text']='123'                   #对按钮控件的属性值更改

返回的是字典,可以以字典的方式将值打印。

#创建窗口控件
def intwind(self):
    frame1 = Frame(self)
    Label(frame1,text='账号:').grid(row=0,column=0)
    Entry(frame1,textvariable=self.username).grid(row=0,column=1)

    frame2 = Frame(self)
    Label(frame2, text='密码:').grid(row=0, column=0)
    Entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

    frame3 = Frame(self)
    Label(frame3, text='身份:').grid(row=0, column=0)
    self.selector = ttk.Combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
    self.selector.grid(row=0, column=1)
    self.selector.current(0)
    self.selector.bind('<<ComboboxSelected>>',self.selectorLinstener)      #绑定一个监听事件/函数,用来监听选择的

    frame3.grid(pady=6)                 #将身份的模块放到最开始显示
    frame1.grid(pady=10)
    frame2.grid()

    btn = Button(self,text='登录',width=12,command=self.buttonActive)
    btn.grid(pady=10)

    # btn.grid_forget()                   #是控件不显示
    # btn.grid()                          #重新显示,需设置pady等

    btn.grid_remove()                   #同样隐藏控件
    btn.grid()                          #重新显示,设置的pady等参数已经保留

    btn.grid_propagate(0)               #0强制控件不变形(当放大缩小时)

    #self.grid_slaves(0,0)获取当前元素的子控件的第几行第几列的控件
    print(self.grid_slaves(0,0))        #获取第0行0列的frame3的控件
    print(self.grid_slaves(0, 1))        #没有第1列的frame,只有第0列的frame,故为空
    print(self.grid_slaves(1, 0))        #获取第1行0列的frame的控件

    # print(self.selector.grid_info())  # 获取selector控件的grid的属性
    # print(btn.grid_info())  # 获取btn控件的grid的属性

    # 此处获取控件的属性的方法(cget()),所有控件都支持
    print(self.selector.cget('values'))             #获取下拉框的属性values
    print(self.selector.cget('width'))              #获取下拉框的属性width

    #使用config获取属性或者更改属性
    # self.selector.config(values=[1,2])      #重新配置属性values的值
    # self.selector.current(0)                #设置选择的当前值

    #使用字典键值对的方式获取属性值,或者更改属性值
    self.selector['values']=[1,2]             #此处的属性的设置相当于上面的
    print(btn['text'])                  #获取上一个按钮控件的属性值,打印
   # btn['text']='123'                   #对按钮控件的属性值更改

9.tkinter自带剪切板操作

一个是添加剪切板,一个是清空剪切板,调用两个函数即可

虽然Python中有个库也可以实现此操作,但使用tkinter的自带函数即可

self.clipboard_append('123')        #在剪切板放入数字123,可以CTR+V
print(self.clipboard_get())         #获取剪切板的内容并打印
self.clipboard_clear()              #清空剪切板内容,再CTR+V就显示不出了

10.所有的代码

#-*- codeing = utf-8 -*- 
#@Time : 2020/12/28 9:43
#@Author : 招财进宝
#@File : _int_.py
#@Software: PyCharm

import tkinter as tk    #导入tk
from tkinter import *     #在下方进行使用tk.Label()等方法时,可直接Label()
from tkinter import messagebox      #此处引入messagebox,尽管之前引入*全部了但找不到
from tkinter import ttk

class Application(tk.Frame):
    #类的初始化函数
    def __init__(self,root):        #传入root窗口
        super().__init__(root)
        self.master = root
        self.pack()                 #pack必须调用,用于将控件添加到窗口中,否则控件不显示
        self.envar = tk.StringVar(None, '123')          #用于编辑框的文本信息输入
        #root.geometry('250x145')                        #设置窗口的大小
        root.minsize(250,145)                           #设置窗口的最小值
        root.maxsize(250, 145)                          #设置窗口的最大值
        root.title('登录')                            #设置窗口的名称
        #root.iconbitmap()                             #设置图标,必须是ico格式的
        self.username = tk.StringVar()  # 用于编辑框的文本信息输入,此处注意在前方要引入from tkinter import messagebox
        self.password = tk.StringVar()  # 用于编辑框的文本信息输入
        self.select = tk.StringVar(None,'普通成员')     #设置默认数据为普通成员

        self.intwind()              #调用窗口函数

    def buttonActive(self):
        u = self.username.get()             #得到编辑框中的内容
        p = self.password.get()
        if len(u)==0 or len(p)==0:
            messagebox.showinfo('提示:','请完整信息')
            return
        messagebox.showinfo('提示:', '你输入的账号:%s\n密码:%s\n你的登录身份是:%s'%(u,p,self.select.get()))

    def selectorLinstener(self,*args):
        print(self.selector.get())
        self.select.set(self.selector.get())

    #创建窗口控件
    def intwind(self):
        frame1 = Frame(self)
        Label(frame1,text='账号:').grid(row=0,column=0)
        Entry(frame1,textvariable=self.username).grid(row=0,column=1)

        frame2 = Frame(self)
        Label(frame2, text='密码:').grid(row=0, column=0)
        Entry(frame2, show='*',textvariable=self.password).grid(row=0, column=1)  #show='*',表示编辑框输入的东西都会显示*

        frame3 = Frame(self)
        Label(frame3, text='身份:').grid(row=0, column=0)
        self.selector = ttk.Combobox(frame3,values=('普通成员','管理员'),width=18) #引入from tkinter import ttk
        self.selector.grid(row=0, column=1)
        self.selector.current(0)
        self.selector.bind('<<ComboboxSelected>>',self.selectorLinstener)      #绑定一个监听事件/函数,用来监听选择的

        frame3.grid(pady=6)                 #将身份的模块放到最开始显示
        frame1.grid(pady=10)
        frame2.grid()

        btn = Button(self,text='登录',width=12,command=self.buttonActive)
        btn.grid(pady=10)

        # btn.grid_forget()                   #是控件不显示
        # btn.grid()                          #重新显示,需设置pady等

        btn.grid_remove()                   #同样隐藏控件
        btn.grid()                          #重新显示,设置的pady等参数已经保留

        btn.grid_propagate(0)               #0强制控件不变形(当放大缩小时)

        #self.grid_slaves(0,0)获取当前元素的子控件的第几行第几列的控件
        print(self.grid_slaves(0,0))        #获取第0行0列的frame3的控件
        print(self.grid_slaves(0, 1))        #没有第1列的frame,只有第0列的frame,故为空
        print(self.grid_slaves(1, 0))        #获取第1行0列的frame的控件

        # print(self.selector.grid_info())  # 获取selector控件的grid的属性
        # print(btn.grid_info())  # 获取btn控件的grid的属性

        # 此处获取控件的属性的方法(cget()),所有控件都支持
        print(self.selector.cget('values'))             #获取下拉框的属性values
        print(self.selector.cget('width'))              #获取下拉框的属性width

        #使用config获取属性或者更改属性
        # self.selector.config(values=[1,2])      #重新配置属性values的值
        # self.selector.current(0)                #设置选择的当前值

        #使用字典键值对的方式获取属性值,或者更改属性值
        self.selector['values']=[1,2]             #此处的属性的设置相当于上面的
        print(btn['text'])                  #获取上一个按钮控件的属性值,打印
       # btn['text']='123'                   #对按钮控件的属性值更改

        self.clipboard_append('123')        #在剪切板放入数字123,可以CTR+V
        print(self.clipboard_get())         #获取剪切板的内容并打印
        self.clipboard_clear()              #清空剪切板内容,再CTR+V就显示不出了


if __name__ == '__main__':
    root = tk.Tk()                   #root代表一个窗口,每调用一次函数就会新生成一个窗口
    application = Application(root)         #初始化一个对象,传入窗口root
    root.mainloop()                  #无限循环,不断更新页面

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python TestCase中的断言方法介绍

    Python TestCase中的断言方法介绍

    这篇文章主要给大家介绍了关于Python TestCase中的断言方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • python使用python-docx-template实现模板化Word文档生成指南

    python使用python-docx-template实现模板化Word文档生成指南

    python-docx库的核心功能是程序化创建全新的Word文档,但在基于已有模板替换其部分内容时,其操作会非常繁琐,python-docx-template正是为解决这一痛点而设计的,下面我们就来看看该如何使用它吧
    2026-01-01
  • 在OpenCV里使用Camshift算法的实现

    在OpenCV里使用Camshift算法的实现

    这篇文章主要介绍了在OpenCV里使用Camshift算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python常用数据库接口sqlite3和MySQLdb学习指南

    Python常用数据库接口sqlite3和MySQLdb学习指南

    在本章节中,我们将学习 Python 中常用的数据库接口,包括 sqlite3用于SQLite数据库和MySQLdb用于 MySQL 数据库,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • python 多进程共享全局变量之Manager()详解

    python 多进程共享全局变量之Manager()详解

    这篇文章主要介绍了python 多进程共享全局变量之Manager()详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python子类继承父类构造函数详解

    Python子类继承父类构造函数详解

    在本文里我们给大家分享一篇关于Python 子类继承父类构造函数的相关知识点内容,需要的朋友们跟着学习下。
    2019-02-02
  • Python并发执行的几种实现方法

    Python并发执行的几种实现方法

    在Python中多线程是实现并发的一种方式,多线程可以让程序在同一时间内进行多个任务,从而提高程序的效率和执行速度,这篇文章主要给大家介绍了关于Python并发执行的几种实现方法,需要的朋友可以参考下
    2024-08-08
  • Python实现音频添加数字水印的示例详解

    Python实现音频添加数字水印的示例详解

    数字水印技术可以将隐藏信息嵌入到音频文件中而不明显影响音频质量,下面小编将介绍几种在Python中实现音频数字水印的方法,希望对大家有所帮助
    2025-04-04
  • 解决pytorch 交叉熵损失输出为负数的问题

    解决pytorch 交叉熵损失输出为负数的问题

    这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Python对象体系深入分析

    Python对象体系深入分析

    这篇文章主要介绍了Python对象体系,以实例的形式进行了较为深入的分析,需要的朋友可以参考下
    2014-10-10

最新评论