Python Tkinter Gui 常用组件介绍 基本使用

2023-10-27

Python Tkinter Gui 窗口图标,标签,输入,单复选,文件导入,按钮,日志 等常用组件 基本使用


前言

tkinter是什么?

我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口;
Tk是一个图形库,支持多个操作系统,使用Tcl语言开发;
Tk会调用操作系统提供的本地GUI接口,完成最终的GUI;

tkinter库简介

python内置的GUI库,只要安装好 Python 环境之后就能 import tkinter 库;
基于Tk工具包,该工具包最初是为TCL设计的,后被应用到多种脚本语言中,使脚本语言可以开发出品质较好的GUI应用,tkinter是用python做的一个调用接口,底层使用C++编写,运行效率上与C++编写的GUI应用相当,但是开发效率远远高于C++;


本文思路:先介绍窗体以及组件的方法和属性,最后附上示例代码供大家参考

一、窗体设置方法

1.tk类对象的方法

Tk类常用方法 描述
title() 设置窗体标题
iconbitmap() 设置窗体logo,建议写绝对路径
geometry() 设置窗体大小,单位是像素
attributes(“-topmost”, 1) 窗体设为置顶 (显示为当前活动窗口)
protocol(‘WM_DELETE_WINDOW’, lambda: clos_window() 设置右上角(X)点击事件,退出/关闭窗体
destroy() 直接退出/关闭窗体
winfo_screenwidth() 获取屏幕宽度
winfo_screenheight() 获取屏幕高度
mainloop() 界面循环,即是显示窗体变化

二、常用组件以及公共属性介绍

1.常用组件

组件类 名称 描述
Button 按钮 一个简单的按钮,用来执行一个命令或别的操作,类似标签,但提供额外的功能,例如鼠标掠过、按下、释放以及键盘操作/事件。
Canvas 画布 组织图形,这个部件可以用来绘制图表和图,创建图形编辑器,实现定制窗口部件,提供绘图功能(直线、椭圆、多边形、矩形) ;可以包含图形或位图
Checkbutton 复选框 代表一个变量,它有两个不同的值。点击这个按钮将会在这两个值间切换,一组方框,可以选择其中的任意个
Radiobutton 单选框 一组可选框,其中只有一个可被"选中" ,以当前勾选的值为准
Entry 文本框 文本输入框,文本输入域
Frame 框架/容器 归纳组件,用于模块布局,一个容器窗口部件
Label 标签 用来显示文字或图片
Listbox 列表框 一个选项列表,用户可以从中选择
Menu 菜单 点下菜单按钮后弹出的一个选项列表,用户可以从中选择,菜单条,用来实现下拉和弹出式菜单
Menubutton 菜单按钮 用来包含菜单的组件(有下拉式、层叠式等等)
Scale 进度条 线性“滑块”组件,可设定起始值和结束值,会显示当前位置的精确值
Scrollbar 滚动条 对其支持的组件(文本域、画布、列表框、文本框)提供滚动功能
Text 文本域 多行文字区域,可用来收集(或显示)用户输入的文字(类似 HTML 中的 textarea)
ScrolledText 可滚动文本域 常用于日志输出显示
Toplevel 顶级 类似框架,但提供一个独立的窗口容器

2.公共属性

属性/参数 描述
master 父窗口指针/上级容器(如:TK类对象)
text 组件标题(部分组件有:Button、Label …)
bd 组件边框的大小,默认为 2 个像素
image 组件上要显示的图片
font=(‘行楷’, 15, ‘bold’) 字体,大小,加粗
fg 字体颜色
bg 背景颜色
height 高,单位像素
width
command (Button)绑定处理事件函数,当按钮被点击时,执行该函数 command=function,如需传参( command=lambda: function(“参数”))

三、常用布局摆放方式

1.grid()–>以行和列(网格)形式对控件进行排列,此种方法使用起来较为灵活,推荐此方法

属性/参数 描述
row 设置行数
rowspan 设置跨行数量,控件实例所跨的行数,默认为 1 行,通过该参数可以合并一列中多个领近单元格
column 设置列数
columnsapn 设置跨列数量,控件实例所跨的列数,默认为 1 列,通过该参数可以合并一行中多个领近单元格
ipadx 设置组件的内部"左右"的间距,单位为像素§,或者厘米©、英寸(i)
ipady 设置组件的内部"上下"的间距,单位为像素§,或者厘米©、英寸(i)
padx 设置组件的外部"左右"的间距 ,单位为像素§,或者厘米©、英寸(i)
pady 设置组件的外部"上下"的间距,单位为像素§,或者厘米©、英寸(i)
sticky 该属性用来设置控件位于单元格那个方位上,参数值和 anchor 相同,若不设置该参数则控件在单元格内居中

2.pack()–>按照控件的添加顺序其进行排列,遗憾的是此方法灵活性较差

属性/参数 描述
side 设置组件相对与父组件的摆放位置,组件放置在窗口的哪个位置上,参数值 ‘top’,‘bottom’,‘left’,‘right’。注意,单词小写时需要使用字符串格式,若为大写单词则不必使用字符串格式
ipadx 设置组件的内部"左右"的间距,单位为像素§,或者厘米©、英寸(i)
ipady 设置组件的内部"上下"的间距,单位为像素§,或者厘米©、英寸(i)
padx 设置组件的外部"左右"的间距 ,单位为像素§,或者厘米©、英寸(i)
pady 设置组件的外部"上下"的间距,单位为像素§,或者厘米©、英寸(i)

3.place()–>(x,y)定位摆放,可以指定组件大小以及摆放位置,三个方法中最为灵活的布局方法

属性/参数 描述
anchor 定义控件在窗体内的方位,参数值N/NE/E/SE/S/SW/W/NW 或 CENTER,默认值是 NW
x、y 定义控件在根窗体中水平和垂直方向上的起始绝对位置,(单位为像素),绝对定位
height、width 控件自身的高度和宽度(单位为像素),绝对定位
relx 设置距离左上角的水平长度百分比(0-1),相对定位
rely 设置距离左上角的垂直高度百分比 ,相对定位
relwidth 设置组件所占据的宽度百分比 ,相对定位
relheight 设置组件所占据的高度百分比 ,相对定位

四、示例代码

1.打包(exe)后的环境资源访问

import os
import sys
""" 判断是否为打包(exe)后的环境 """
if getattr(sys, 'frozen', False):
    base_path = sys._MEIPASS
else:
    base_path = os.path.abspath(".")
file_path = os.path.join(base_path, "xxxxxxx")

2.完整代码

示例说明:引用了线程不卡顿,滚动文本域实时更新日志,建议复制代码运行仔细观察一下有助于理解
该示例使用了grid()网格布局,输入组件,标签组件,文件选择组件,单选框组件,复选框组件,按钮,滚动文本域,大部分都写了注释哈;

import sys
import time
import tkinter as tk
from tkinter import messagebox
from tkinter.messagebox import askyesno
from tkinter.filedialog import askopenfilename  # 文件选择
from tkinter.scrolledtext import ScrolledText
import threading


class TestGui(object):
    def __init__(self, init_window_name):
        self.file_input_dirs = None  # 存放文件地址变量
        self.init_window_name = init_window_name
        self.init_window_name.title("Python Tkinter 常用组件 - 基本使用")  # 设置窗口标题
        self.init_window_name.geometry('700x400')  # 设置窗口大小
        self.init_window_name.iconbitmap('resource/test.ico')  # 设置窗体左上角logo,建议写绝对路径
        self.init_window_name.attributes("-topmost", 1)  # tk界面置顶
        """ 点击右上角关闭窗体弹窗事件 """
        self.init_window_name.protocol('WM_DELETE_WINDOW', self.clos_window)
        """ 组件容器创建 """
        self.input_frame = tk.Frame(master=self.init_window_name)  # 创建存放文本输入,文件选择组件的容器
        self.input_frame.grid(padx=20, pady=5, row=1, column=0, sticky=tk.W)  # 外间距20px,上下间距01行,0(0开始)列
        self.choose_day_frame = tk.Frame(master=self.init_window_name)  # 创建存放单选组件的容器
        self.choose_day_frame.grid(padx=20, pady=0, row=2, column=0, sticky=tk.W)
        self.choose_number_frame = tk.Frame(master=self.init_window_name)  # 创建存放复选组件的容器
        self.choose_number_frame.grid(padx=20, pady=0, row=3, column=0, sticky=tk.W)
        self.log_frame = tk.Frame(master=self.init_window_name)  # 创建存放日志组件的容器
        self.log_frame.grid(padx=20, pady=0, row=4, column=0, sticky=tk.W)
        self.runs_button_frame = tk.Frame(self.init_window_name)  # 创建存放日志组件的容器
        self.runs_button_frame.grid(padx=20, pady=0, row=5, column=0, sticky=tk.W)
        """ 文本输入,文件选择组件 """
        self.file_input_title = tk.Label(self.input_frame, text="输入文件地址", font=('行楷', 15))
        self.file_input_title.grid(padx=20, pady=0, row=0, column=0, sticky=tk.W)
        self.file_input_entry = tk.Entry(self.input_frame, font=('行楷', 20), width=24)
        self.file_input_entry.grid(padx=0, pady=0, row=0, column=1)
        self.file_input_button = tk.Button(self.input_frame, text="选择文件", font=('行楷', 15), width=12, fg="white", bg="#1E90FF", command=self.file_input_path)
        self.file_input_button.grid(padx=10, pady=0, row=0, column=2, sticky=tk.W)
        """ 单选框 - 选择日期 """
        self.radio_label = tk.Label(self.choose_day_frame, text="单选框:", font=('行楷', 15))
        self.radio_label.grid(padx=20, pady=0, row=0, column=1, sticky=tk.W)
        self.choose_day_value = tk.StringVar()
        self.date_list = ['2022-10-16', '2022-10-17', '2022-10-18', '2022-10-19']
        self.choose_day_value.set(0)  # 设置默认值 '0'
        # 单选组件参数介绍 text=勾选框文本, variable=赋值对象, value=勾选后的值
        self.choose_day_one = tk.Radiobutton(self.choose_day_frame, text=self.date_list[0], variable=self.choose_day_value, value=self.date_list[0], font=('行楷', 12))
        self.choose_day_one.grid(padx=12, pady=0, row=0, column=2)
        self.choose_day_two = tk.Radiobutton(self.choose_day_frame, text=self.date_list[1], variable=self.choose_day_value, value=self.date_list[1], font=('行楷', 12))
        self.choose_day_two.grid(padx=12, pady=0, row=0, column=3)
        self.choose_day_three = tk.Radiobutton(self.choose_day_frame, text=self.date_list[2], variable=self.choose_day_value, value=self.date_list[2], font=('行楷', 12))
        self.choose_day_three.grid(padx=12, pady=0, row=0, column=4)
        self.choose_day_four = tk.Radiobutton(self.choose_day_frame, text=self.date_list[3], variable=self.choose_day_value, value=self.date_list[3], font=('行楷', 12))
        self.choose_day_four.grid(padx=12, pady=0, row=0, column=5)
        """ 复选框 - 选择数字 """
        self.check_label = tk.Label(self.choose_number_frame, text="复选框:", font=('行楷', 15))
        self.check_label.grid(padx=20, pady=0, row=0, column=1, sticky=tk.W)
        self.choose_number_value_one = tk.IntVar()
        self.choose_number_value_one.set(0)  # 设置默认值 0
        self.choose_number_value_two = tk.IntVar()
        self.choose_number_value_two.set(0)  # 设置默认值 0
        self.choose_number_value_three = tk.IntVar()
        self.choose_number_value_three.set(0)  # 设置默认值 0
        # 复选组件参数介绍 text=勾选框文本, variable=赋值对象, onvalue=勾选后的值, offvalue未勾选的值
        self.choose_entry_time_one = tk.Checkbutton(self.choose_number_frame, text='1', variable=self.choose_number_value_one, onvalue=1, offvalue=0, font=('行楷', 12))
        self.choose_entry_time_one.grid(padx=12, pady=0, row=0, column=2)
        self.choose_entry_time_two = tk.Checkbutton(self.choose_number_frame, text="2", variable=self.choose_number_value_two, onvalue=2, offvalue=0, font=('行楷', 12))
        self.choose_entry_time_two.grid(padx=12, pady=0, row=0, column=3)
        self.choose_entry_time_three = tk.Checkbutton(self.choose_number_frame, text="3", variable=self.choose_number_value_three, onvalue=3, offvalue=0, font=('行楷', 12))
        self.choose_entry_time_three.grid(padx=12, pady=0, row=0, column=4)
        """ 日志框 """
        self.run_log = ScrolledText(self.log_frame, font=('楷体', 13), width=69, height=14)
        self.run_log.grid(padx=20, pady=5, row=0, column=0)
        """ 操作按钮 """
        self.start_run1 = tk.Button(self.runs_button_frame, text='参数打印', font=('行楷', 15, 'bold'), fg="white", bg="#1E90FF", width=16, command=lambda: self.thread_it(self.param_print))
        self.start_run1.grid(padx=20, pady=0, row=0, column=1)
        self.start_run2 = tk.Button(self.runs_button_frame, text='线程测试打印1', font=('行楷', 15, 'bold'), fg="white", bg="#1E90FF", width=16, command=lambda: self.thread_it(self.print1))
        self.start_run2.grid(padx=15, pady=0, row=0, column=2)
        self.start_run3 = tk.Button(self.runs_button_frame, text='线程测试打印2', font=('行楷', 15, 'bold'), fg="white", bg="#1E90FF", width=16, command=lambda: self.thread_it(self.print2))
        self.start_run3.grid(padx=20, pady=0, row=0, column=3)

    def thread_it(self, func, *args):
        """ 将函数打包进线程 """
        self.myThread = threading.Thread(target=func, args=args)
        self.myThread .setDaemon(True)  # 主线程退出就直接让子线程跟随退出,不论是否运行完成。
        self.myThread .start()

    def file_input_path(self):
        """ 上传文件路径选择 """
        path_ = askopenfilename()  # 文件选择方法,目录选择是 from tkinter.filedialog import askdirectory,用法一致
        self.file_input_dirs = path_  # 将字符串文件地址给变量
        self.file_input_entry.delete(0, tk.END)  # 将文本输入组件的信息删除
        self.file_input_entry.insert(tk.END, path_)  # 在文本输入组件,插入文件导入按钮的字符串地址

    def param_print(self):
        # 如果输入地址和文件选择按钮的值都为None,则提示
        if len(self.file_input_entry.get().strip()) < 1 and self.file_input_dirs is None:
            messagebox.showwarning(title='小洲助手v1.1警告', message='必须输入或选择文件地址!')
            return False
        # 如果输入地址为空则选用文件选择按钮的值
        if len(self.file_input_entry.get().strip()) > 1:
            file_path = self.file_input_entry.get().strip()
        else:
            file_path = self.file_input_dirs
        file_path_content = f"文件地址为:{file_path}"
        # 不勾选单选框则值为初始设置的'0', 赋值None
        radio_value = 'None' if self.choose_day_value.get() == '0' else self.choose_day_value.get()
        radio_value_content = f"单选值为:{radio_value}"
        # 不勾选复选框则值为初始设置的0, 赋值None
        check_value_one = 'None' if self.choose_number_value_one.get() == 0 else self.choose_number_value_one.get()
        check_value_two = 'None' if self.choose_number_value_two.get() == 0 else self.choose_number_value_two.get()
        check_value_three = 'None' if self.choose_number_value_three.get() == 0 else self.choose_number_value_three.get()
        check_value_content = f'复选值依次为:{check_value_one}, {check_value_two}, {check_value_three}'
        self.run_log_print(file_path_content)
        self.run_log_print(radio_value_content)
        self.run_log_print(check_value_content)  # 日志输出

    def print1(self):
        for i in range(100):
            tip_content = f'第{i}次打印 - 我是小洲1'
            self.run_log_print(message=tip_content)
            time.sleep(0.05)  # 睡眠,单位秒
        self.run_log_print(message='我是小洲1 - 打印完成')

    def print2(self):
        for i in range(100, 200):
            tip_content = f'第{i}次打印 - 我是小洲2'
            self.run_log_print(message=tip_content)
            time.sleep(0.05)  # 睡眠
        self.run_log_print(message='我是小洲2 - 打印完成')

    def run_log_print(self, message):
        """ 实时更新日志,固定用法 """
        self.run_log.config(state=tk.NORMAL)
        self.run_log.insert(tk.END, "\n" + message + "\n")
        self.run_log.see(tk.END)
        self.run_log.update()
        self.run_log.config(state=tk.DISABLED)

    def clos_window(self):
        """ 退出/关闭窗体 固定方法 """
        ans = askyesno(title='小洲助手v1.1警告', message='是否确定退出程序?\n是则退出,否则继续!')
        if ans:
            self.init_window_name.destroy()
            sys.exit()
        else:
            return None


if __name__ == '__main__':
    """ 实例化出一个父窗口 """
    init_window = tk.Tk()
    """ 创建Gui类对象 """
    test_gui = TestGui(init_window)
    """ 界面循环,实时显示窗体变化 """
    init_window.mainloop()

3.运行效果


运行效果gif


总结

以上就是今天要讲的内容,本文仅仅介绍了Tk制作Gui界面的简单使用,而Tk为我们提供了大量封装程序功能的函数和方法,丰富用户的体验感,后续有关于tk的常用代码会在这篇博客中持续更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Tkinter Gui 常用组件介绍 基本使用 的相关文章

随机推荐

  • EMQX Newsletter 2022-05|v5.0 发布 2 个 rc 版本、云服务新增外部认证与数据集成方式

    五月 EMQX 5 0 0 rc 3 rc 4 版本陆续发布 该版本为规则引擎新增了对 jq 语法的支持 大幅度精简了默认配置文件 并对 Dashboard 菜单栏做了进一步的调整优化 EMQX 5 0 的正式发布已经越来越近 同时 v4
  • [Python 与 炒股] TuShare 使用篇之二

    之前是直接在控制台上使用 TuShare 来获取一些数据 接下来就写一个最简单的脚本来测一下TuShare 每个股民都有自己的股票池 那个就写一个程序来实时观测当前的股价 代码如下所示 usr bin python coding UTF 8
  • 设计模式:观察者模式和监听器模式

    最近有个需求 大概是想用一下观察者模式 或者是监听器模式 来实现一下 那问题来了什么是观察者模式 什么是监听器模式 两者之间有哪些联系和不同 具体实现是什么样的 那就听我讲解一下 观察者模式和监听器模式的组成 首先做一个总结 监听器模式实际
  • Docker Kafka

    0X00 CentOS部署kafka CentOS7搭建Kafka环境 简书Kafka是一个分布式流平台 基于Zookeeper的分布式消息系统 具有高吞吐量 高性能 实时及高可用等特点由服务器和客户端组成 通过高性能的TCP网络协议进行通
  • 一篇文章入门-微信小程序地图开发

    前言 最近接了个跟微信小程序地图有关的开发任务 第一次在小程序上开发地图 既兴奋又忐忑 还好 虽然小程序地图的 API 功能有些少 但是基本的需求都能覆盖到 在这里 对微信小程序地图开发的基本功能进行总结归纳 官方文档对地图属性 方法的归纳
  • oracle基础之开窗函数 2021-11-07

    oracle基础之开窗函数 1 开窗函数 又叫分析函数 2 标志 over 3 窗口 定义的 窗口 指的是运算将要操作的数据集合 开窗函数即是对一组值进行操作 4 两种开窗操作 partition by 列名 分组 order by 列名
  • 【问题】BurpSuite,捕捉不到Chrome浏览器上DVWA的请求

    问题 搭建DVWA后 http 127 0 0 1 DVWA setup php 配置后Burp Suite捕捉不到DVWA请求 解决 获取本机IP 用本机IP请求 http 192 168 126 1 DVWA setup php 然后就
  • Wonderful Coloring - 1

    题目 题目链接 题解 include
  • 树莓派的网络连接错误

    当用电脑直连树莓派的时候 点击树莓派的网络连接的时候一直显示 eth0 link is up configuring 链接已打开 正在配置 然而打开树莓派终端的时候敲命令ifconfig又显示地址 估计大家都遇到过很多问题 这是为什么呢 首
  • Qlik Sense 移动端安装配置

    在之前的文章中 我们了解到Qlik Sense是一款数据分析可视化的应用 使人们能够轻松地组合来自许多不同来源的数据 并自由探索 而不受基于查询的工具的限制 不仅支持Web端访问 还有配套的Windows Desktop使用 那么移动端是否
  • 一点逻辑

    1 前传 80年代 改革开放初期 中央政府没钱 地方政府没钱 企业没钱 老百姓没钱 农村有家庭联产承包责任制 城市咋办 经济学者厉以宁号称厉股份 给出了一个建议 人们自筹资金入股 成立股份制企业 老百姓没钱 没钱也能挤出牙缝钱 所以中国第一
  • QT 信号和槽传递自定义对象问题

    QT 如果直接传递自定义的对象会报错导致信号和槽无法连接成功 这里提供两种方法解决 1 传递对象指针 信号和槽在传递自定义对象时 改为传对象指针 2 使用 qRegisterMetaType 将对象注册为元类型 使用qRegisterMet
  • 大型游戏动作竞技游戏开发和体感VR/AR游戏开发:创造引人入胜的虚拟世界

    大型游戏动作竞技游戏和体感VR AR游戏都代表了游戏开发领域的最新趋势 它们提供了高度沉浸式的娱乐体验 结合了视觉 听觉和体感互动 在本文中 我们将探讨如何开发这两种类型的游戏 并介绍其关键特点和开发流程 大型游戏动作竞技游戏的特点 高品质
  • 秋招面经汇总(算法工程师,计算机视觉工程师,深度学习工程师,机器学习工程师)

    前言 随着高通的正式offer下来 基本上秋招结束了 剩下的就是一些三方和合同处理的事情 我的秋招从8月开始准备 到10月末 后面有可能再随便考一下省考选调什么的 体验一下 背景是广东工业大学本硕 1 7月份在某公司的研究院实习 有一篇SC
  • flutter ios webview不能打开http地址

    参考 1 iOS添加信任 webview flutter 在使用过程中会iOS出现无法加载HTTP请求的情况 但是Flutter 却可以加载HTTP请求 这就与两个的框架有关了 Flutter是独立于UIKit框架的 解决方案就是在iOS
  • Sql Server 增加字段、修改字段、修改类型、修改默认值

    原文 Sql Server 增加字段 修改字段 修改类型 修改默认值 1 修改字段名 alter table 表名 rename column A to B 2 修改字段类型 alter table 表名 alter column 字段名
  • cv2,Image,Tensor图像shape中hw顺序

    经常忘记h和w的顺序 这次记录一下 图像为h 1000 w 1700 从结果可以看到 Image比较特殊 是w h cv2的resize中的dsize也是w h img Image open 001 png print img size w
  • 数据库系统概念复习

    第2章 关系模型介绍 zcy 2021 5 10 2 1 关系型数据库的结构 关系 relation 表 元组 tuple 行 属性 attribute 列 域 domin 对于关系的每个属性 都存在一个允许取值的集合 关系的所有属性的域都
  • 关于华为--公司概况

    关于华为 公司概况 华为技术有限公司成立于1988年 专门从事通信网络技术与产品的研究 开发 生产与销售 致力于为电信运营商提供固定网 移动网 数据通信网和增值业务领域的网络解决方案 是中国电信市场的主要供应商之一 并已成功进入全球电信市场
  • Python Tkinter Gui 常用组件介绍 基本使用

    Python Tkinter Gui 窗口图标 标签 输入 单复选 文件导入 按钮 日志 等常用组件 基本使用 文章目录 Python Tkinter Gui 窗口图标 标签 输入 单复选 文件导入 按钮 日志 等常用组件 基本使用 TOC