python tkinter

news2024/12/23 16:10:53

基本使用

基于tkinter创建 GUI基本四步:窗口->组件->布局->事件

1.创建窗口对象

from tkinter import *

root = Tk()  # 创建窗口

root.mainloop()  # 进入事件循环

2.创建组件

按钮文本等组件

btn = Button(root)  # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮'  # 组件属性参数

3.布局管理

管理组件的大小位置样式

btn.pack()  # 布局管理器,组件的大小位置样式

4.事件

通过与组件绑定,获取组件所触发的事件

def btn_event(obj):  # obj 即事件对象
    print('控制台输出:'+'触发了事件')  # 输出到控制台
btn.bind('<Button-1>', btn_event)  # 事件和组件进行绑定

案例:

from tkinter import *
from tkinter import messagebox

root = Tk()  # 创建窗口

btn = Button(root)  # 创建Button组件,使组件在root窗口展示
btn['text'] = '我是按钮'
btn.pack()  # 布局管理器,配置组件的样式

def btn_event(obj):  # obj 即事件对象
    messagebox.showinfo("Message","触发了事件")  # 弹出新的窗口,并展示内容
    print('控制台输出:'+'触发了事件')  # 输出到控制台

btn.bind('<Button-1>', btn_event)  # 事件绑定,事件和组件进行绑定  <Button-1> :鼠标左键点击一次  <Button-2>:鼠标右键点击一次

if __name__ == '__main__':
    root.mainloop()  # 进入事件循环

主窗口

title('窗口标题')

geometry('wxh ± x, ±y') 

  • w:宽度
  • h:高度
  • +x:距屏幕左边的距离,-x:距屏幕右边的距离
  • +y:距屏幕上边的距离,-y:距;屏幕下边的距离
root.geometry('500x300+100+200')  # 宽度500,高度300,距左边100,距上边200

组件

Toplevel顶层容器类,可为其他组件提供单独的容器,类似窗口
Button按钮按钮点击组件
Ganvas画布提供绘图功能
CheckButton复选框可勾选的复选框
Entry单行输入框可输入内容
Frame容器用于装载其他组件
LabelFrame容器类似Frame,但可以添加标题
label标签显示不可编辑的文本或图标
Listbox列表框可列出多个选项
Menu菜单菜单组件
MenuButton菜单按钮包含菜单的按钮,包括下拉层叠式等
OptionMenuu菜单按钮MenuButton的子类,可通过按钮打开一个菜单
Message消息框可以显示多行文档

Frame容器

GUI编程就是编写一个个组件,界面由组件组成,组件内又可以创建组件,这种组件即为容器

import tkinter as tk
from tkinter import Frame

root = tk.Tk()
root.title('包含容器的GUI')
root.geometry('500x300+200+200')
frame = Frame(master=root)  # 在root中创建容器
frame.pack()

root.mainloop()

经典的面向对象的GUI

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('经典的面向对象的GUI')
root.geometry('500x300+200+200')

class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.btn01 = Button(self, text='容器的按钮01', command=self.btn01_event)  # 创建button组件,在Frame中显示,这里的self是Frame
        self.btn01.pack()

        self.btn02 = Button(self, text='退出', command=root.destroy)
        self.btn02.pack()

    def btn01_event(self):
        messagebox.showinfo('Message', '触发了事件')
        print('控制台输出:' + '触发了事件')  # 输出到控制台


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

 

 Label

  • font:字体和大小,1个中文宽度两个字符,高度一个字符
  • image:图片,目前支持gif
  • fg:前景色,bg:背景色
  • justigy:对齐方式,left、center、right
  • width:宽度,heigth:高度
import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        # 文件标签
        self.text_label = Label(self, text='label组件',
                           width=10, height=2, bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
        self.text_label.pack()
        self.text_label2 = Label(self, text='label组件\nlabel组件内容不能修改\n哈哈',
                           bg='black', fg='white', font=('黑体', 15), justify='left', borderwidth=1)
        self.text_label2.pack()
        # 图片标签
        global PHOTO
        PHOTO = PhotoImage(file='img.gif')  # 注意:图片最好是全局变量
        self.photo_label = Label(root, image=PHOTO)
        self.photo_label.pack()


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

 

Button

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')

PHOTO = PhotoImage(file='img.gif')  # 注意:图片最好是全局变量


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.login_btn = Button(self, text='登录', command=self.login_event)  # 创建button组件,在Frame中显示,这里的self是Frame
        self.login_btn.pack()

        self.image_btn = Button(self, image=PHOTO, command=self.image_event)
        self.image_btn.pack()
        self.image_btn['state'] = 'disable'  # 按钮禁止点击

    def image_event(self):
        messagebox.showinfo('Message', '点击了图片')

    def login_event(self):
        messagebox.showinfo('Message', '登录成功')
        # print('控制台输出:' + '触发了事件')  # 输出到控制台


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Entry

import tkinter as tk
from tkinter import *
from tkinter import messagebox

root = tk.Tk()
root.title('我是窗口')
root.geometry('500x300+200+200')


class Application(Frame):
    def __init__(self, master):
        super().__init__(master)

        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        '''创建各种组件'''
        self.user_label = Label(self, text='用户')
        self.user_label.pack()

        user_value = StringVar()  # 定义变量,要用来接收Entry输入的值
        user_value.set('admin')  # StringVar 的默认值
        self.user_entry = Entry(self, textvariable=user_value)  # StringVar变量绑定到Entry组件
        self.user_entry.pack()
        print(user_value.get())
        print(self.user_entry.get())

        self.pwd_label = Label(self, text='密码')
        self.pwd_label.pack()
        pwd_value = StringVar()
        self.pwd_entry = Entry(self, textvariable=pwd_value, show="*")  # 用户输入的内容展示成 *
        self.pwd_entry.pack()

        self.user_btn = Button(self, text='提交', command=self.login)
        self.user_btn.pack()

    def login(self):
        print('用户名: ' + self.user_entry.get())  # 获取输入框的值
        print('用户密码: ' + self.pwd_entry.get())  # 获取输入框的值
        messagebox.showinfo('Message', '登录成功')


def main():
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

re题(25)BUUFCTF-[GUET-CTF2019]re

BUUCTF在线评测 (buuoj.cn) 查下壳&#xff0c;是upx壳 脱一下 查看字符串&#xff0c;定位到主函数&#xff0c;也可以用ctrlE的方式找到主函数 明显&#xff0c;sub_4009AE是对flag加密的关键函数 进入sub_4009AE看一下 看到这儿有一堆大数和方程&#xff0c;我们知道要用z…

Transformer模型详细步骤

Transformer模型是nlp任务中不能绕开的学习任务&#xff0c;我将从数据开始&#xff0c;每一步骤都列举出来&#xff0c;然后对应重点的代码进行讲解 ------------------------------------------------------------------------------------------------------------- Trans…

Skytower

一、安装配置靶机 下载地址: SkyTower: 1 ~ VulnHub 下载之后解压发现是VirtualBox格式的 我们下载一个VirtualBox&#xff0c;这是官网 Downloads – Oracle VirtualBox 安装到默认路径就 打开后点击注册 选择解压后的vbox文件 然后点击左上角管理 点击导出虚拟电脑&…

PCIe进阶之TL:Request Handling Rules

1 Handling of Received TLPs 本节介绍接收到的 TLP 在数据链路层经过完整性验证之后,这些 TLP 在事务处理层时的处理方式。这些规则如下图所示: 接收侧会忽略保留字段。如果 Fmt 字段显示存在至少一个 TLP Prefix : (1)通过检查后续 DWORD 的第一个字节中的 Fmt 字段,…

两个人群填充参考(CHN100K和NARD)

分别是中国人群和东北亚人群的填充参考&#xff0c;测试了下&#xff0c;中国人群的参考注册还是相对友好的&#xff0c;没有像有些网站一样严格限制。东北亚的没有测试&#xff0c;两个数据库的特点都是包含了少数民族&#xff0c;研究朝鲜或蒙古族或其他民族的同学&#xff0…

Java 枚举 新特性

Java 枚举&#xff08;enum&#xff09;自JDK 1.5引入以来&#xff0c;随着版本的升级不断增强。本文将回顾枚举的演进&#xff0c;尤其是结合switch语句的应用&#xff0c;展示枚举如何在现代Java中变得更加灵活。 1. JDK 1.5&#xff1a;Java 枚举的诞生 在JDK 1.5之前&…

Dbt基本概念与快速入门

在过去的几年里&#xff0c;数据科学界已经慢慢地接受了以数据为中心的范式。我们不仅关注日益复杂的机器学习模型&#xff0c;还要更多地关注数据质量。这使得数据工程、分析工程领域技术和工具成为热点。dbt(数据构建工具)是一个显著改善数据工程师生活的工具。它的目的是向数…

【漏洞复现】金某云星空ERP GetImportOutData .net反序列化漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

Chinese Spelling Correction as Rephrasing Language Model(AAAI2024)

Chinese Spelling Correction as Rephrasing Language Model(AAAI2024) 一&#xff0e;概述 目前最先进的方法将CSC(Chinese Spelling Correction)作为序列标注任务&#xff0c;并在句子对上微调基于bert的方法。然而&#xff0c;我们注意到在将一个字符标注为另一个字符的过…

springboot+mybatis+mysql仿百度网盘系统2.0

springbootmybatismysql仿百度网盘系统2.0 一、系统介绍二、功能展示1.用户登陆2.主页3.全部文件4.文件上传5.文件分享6.文件分类 三、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a; 普通用户&#xff1a;用户登陆、主页、全部文件、上传文件、文件分类、文件分部…

初始爬虫6

数据提取 数据提取总结 响应分类 结构化 json数据&#xff08;高频出现&#xff09; json模块 jsonpath模块 xml数据&#xff08;低频出现&#xff09; re模块 …

AJAX 入门 day3

目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…

TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错

目录 1&#xff0c;前言2&#xff0c;二者关系2.1&#xff0c;使用 3&#xff0c;遇到的问题3.1&#xff0c;TS 中使用 JS 1&#xff0c;前言 通过 Vite 创建的 Vue3 TS 项目&#xff0c;根目录下会有 tsconfig.json 和 tsconfig.node.json 文件&#xff0c;并且存在引用关系…

【云原生监控】Prometheus之PushGateway

Prometheus之PushGateway 文章目录 Prometheus之PushGateway介绍作用资源列表基础环境一、部署PushGateway1.1、下载软件包1.2、解压软件包1.3、编辑配置systemctl启动文件1.4、创建日志目录1.5、加载并启动1.6、监控端口1.7、访问PushGateway 二、 配置Prometheus抓取PushGate…

超声波测距

基本原理&#xff1a;超声波测距是通过发射超声波到物体表面再反射回来&#xff0c;通过测量声波传播的时间来计算距离的方法。 公式解释&#xff1a; ( L C \times T ) ( L )&#xff1a;距离&#xff08;从发射头到接收头的总距离&#xff09;( C )&#xff1a;声波的传播速…

汉王手写签批控件如何在谷歌、火狐、Edge等浏览器使用

背景 近日&#xff0c;有网友咨询汉王手写签批控件是否可以通过allWebPlugin中间件技术加载到谷歌、火狐、Edge等浏览器&#xff1f;为此&#xff0c;笔者详细了解了一下汉王手写签批控件&#xff0c;它是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;…

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖&#xff1f; 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存&#xff1a;单例池&#xff0c;经历过完整bean生命&#xff0c;单例Bean对象2.2 二级缓存&#xff1a;提前暴露的Bean2.3 三级缓存&#xff1a;打破循环 3. S…

【CMake】使用CMake在Visual Studio 构建多cpp文件项目

首先&#xff0c;我们在 C m a k e Cmake Cmake文件下写入以下代码&#xff1a; #需求的最低cmake程序版本 cmake_minimum_required(VERSION 3.12)#本工程的名字 project(OpenGL)#支持的C版本 set(CMAKE_CXX_STANDARD 20)#本工程主程序文件及输出程序名称&#xff0c;生成exe …

TriangleIcon 鸿蒙ArkTS自定义View 实现带颜色的上下箭头

TriangleIcon 鸿蒙ArkTS自定义View 实现带颜色的上下箭头 最近将公司项目中VUE实现的的一个数据看板模块进行了纯血鸿蒙的实现&#xff0c;里面有个效果就是 数据指标上升 一个绿色箭头朝上&#xff0c;数据指标下降一个红色箭头向下 具体的效果可以查看上图&#xff0c; 其中V…

Vue3 项目实战甄选硅谷

1.技术选型 2.搭建Vue3 项目使用pnpm 1.安装pnpm pnpm安装 npm i -g pnpm 2.项目初始化 pnpm create vite cd ./project pnpm i pnpm run dev 初始化完成 3.项目开始之前先对项目进行一些配置 1.想让刚启动项目浏览器自动打开 找到 2.eslint配置 1.安装eslint pnpm…