Python Gui之tkinter

news2024/12/28 5:11:15

GUI是什么

目录

1。GUI编程的核心步骤和第一个GUI程序

2.tkinter主窗口​​​​​​​

3.GUI的整体描述

常用组件汇总

4.简单的组件

1.Label标签

2.Options选项详解

3.Button

4.Entry单行文本框

5.Text多行文本框



1。GUI编程的核心步骤和第一个GUI程序

from tkinter import *
from tkinter import messagebox
root = Tk()

btn01 = Button(root)
btn01['text'] = '点我就送花'

btn01.pack()


def songhua(e):    #e就是事件对象
    messagebox.showinfo("Message","送你一朵玫瑰花")
    print("送你99朵玫瑰花")
btn01.bind("<Button-1>",songhua)
root.mainloop()  #调用组件的mainloop()方法,进入事件循环

2.tkinter主窗口

root.title("我的第一个GUI程序")      #显示程序名称
root.geometry("500x300+100+200")   #生成一个长500宽300离左边100上面200的窗口

3.GUI的整体描述

常用组件汇总

Widget

'''经典的Gui类的写法,使用面向对象的方法'''

from tkinter import *
from tkinter import  messagebox

class Application(Frame):
    '''一个经典的Gui的类的写法'''

    def __init__(self,master=None):
        super().__init__(master)   #super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWideget()

    def createWideget(self):
        '''创建组件'''
        self.btn01 = Button(self)
        self.btn01["text"] = "点击送花"
        self.btn01.pack()
        self.btn01["command"] = self.songhua

        # 创建一个退出按钮
        self.btnQuit = Button(self, text="退出", command=root.destroy)
        self.btnQuit.pack()

    def songhua(self):
        messagebox.showinfo("送花","送你99朵玫瑰花")


if __name__ == '__main__':  
    root = Tk()
    root.geometry("500x100+200+300")
    root.title("一个经典的GUI程序的类的测试")
    app = Application(master=root)
    root.mainloop()

4.简单的组件

1.Label标签

1.width,height:用于指定区域大小,如果显示是文本,则以单个英文字符大小为单位(一个汉字宽度占2个字符位置,高度和英文字符一样);如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。

2.font指定字体和字体大小,如:font = (font_name,size)

3.image:显示在Label上的图像,目前tkinter只支持gif格式。

4.fg和bgfg(foreground):前景色、bg(background):背景色

5.justify针对多行文字的对齐,可设置justify属性,可选值"left","center" or "right"

'''经典的Gui类的写法,使用面向对象的方法'''

from tkinter import *
from tkinter import  messagebox

class Application(Frame):
    '''一个经典的Gui的类的写法'''

    def __init__(self,master=None):
        super().__init__(master)   #super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWideget()

    def createWideget(self):
        '''创建组件'''
        self.label01 = Label(self, text="测试label", width=10, height=2, bg="black", fg="white")
        self.label01.pack()
        self.label02 = Label(self, text="测试label2", width=10, height=2, bg="blue", fg="white", font=("黑体",30))
        self.label02.pack()
        '''显示图像'''
        global  photo   #把photo声明全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像
        photo = PhotoImage(file="img/2.gif")
        self.label03 = Label(self, image=photo)
        self.label03.pack()
        '''多行文本'''
        self.label04 = Label(self, text="DNSscan\nauther:Darling\n嘤嘤嘤", borderwidth=5, relief="groove", justify="right")
        self.label04.pack()


if __name__ == '__main__':
    root = Tk()
    root.geometry("500x400+200+300")
    root.title("测试label组件")
    app = Application(master=root)
    root.mainloop()

2.Options选项详解

通过学习Label组件,我们发现可以通过Options设置组件的属性,从而控制组件的各种状态。比如:宽度、高度、颜色、位置等等。我们可以通过三种方式设置Options选项,这在各种GUI组件中用法都一致。

1.创建对象时,使用可变参数fred=Button(self,fg="red",bg="blue")

2.创建对象后,使用字典索引方式fred["fg"]="red"fred["bg"]="blue"

3.创建对象后,使用config()方法fred.config(fg="red",bg="blue")

3.Button

Button(按钮)用来执行用户的单击操作。Button可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。

'''经典的Gui类的写法,使用面向对象的方法'''

from tkinter import *
from tkinter import  messagebox

class Application(Frame):
    '''一个经典的Gui的类的写法'''

    def __init__(self,master=None):
        super().__init__(master)   #super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWideget()

    def createWideget(self):
        '''创建组件'''
        self.btn01=Button(root, text="登录", command=self.login)
        self.btn01.pack()

        global  photo
        photo = PhotoImage(file="img/2.gif")
        self.btn02 = Button(root, image=photo, command=self.login)
        self.btn02.pack()

    def login(self):
        messagebox.showinfo("DNSscan一体化渗透框架","登录成功")

if __name__ == '__main__':
    root = Tk()
    root.geometry("500x400+200+300")
    root.title("测试Button组件")
    app = Application(master=root)
    root.mainloop()


4.Entry单行文本框

Entry用来接收一行字符串的控件。如果用户输入的文字长度长于Entry控件的宽度时,文字会自动向后滚动。如果想输入多行文本,需要使用Text控件。

'''经典的Gui类的写法,使用面向对象的方法'''

from tkinter import *
from tkinter import  messagebox

class Application(Frame):
    '''一个经典的Gui的类的写法'''

    def __init__(self,master=None):
        super().__init__(master)   #super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWideget()

    def createWideget(self):
        '''创建登录组件'''
        self.label01 = Label(self, text="用户名")
        self.label01.pack()

        #StringVar变量绑定到指定的组件
        # StringVar变量的值发生变化,组件内容也发生变化;
        #组件内容发生变化,StringVar变量的值也发生变化
        v1 = StringVar()
        self.entry01 = Entry(self, textvariable=v1)
        self.entry01.pack()
        v1.set("admin")
        print(v1.get());print(self.entry01.get())
        '''创建密码框'''
        self.label02 = Label(self, text="密码")
        self.label02.pack()
        v2 = StringVar()
        self.entry02 = Entry(self, textvariable=v2, show="*")
        self.entry02.pack()

        # self.btn01 = Button(self, text="登录", command=self.login)
        # self.btn01.pack()
        Button(self, text="登录",command=self.login).pack()



    def login(self):
        username = self.entry01.get()
        pwd =self.entry02.get()

        print("去数据库对比用户名和密码!")
        print("用户名"+username)
        print("密码" + pwd)
        
        if username=="admin" and pwd=="admin" :
            messagebox.showinfo("DNSscan一体化渗透框架","登录成功,欢迎使用DNSscan一体化渗透框架")
        else:
            messagebox.showinfo("DNSscan一体化渗透框架","登录失败!用户名或密码错误")

if __name__ == '__main__':
    root = Tk()
    root.geometry("500x400+200+300")
    root.title("测试Button组件")
    app = Application(master=root)
    root.mainloop()


5.Text多行文本框

Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接,图片,HTML页面,甚至CSS样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDLE就是Text组件构成的。

'''经典的Gui类的写法,使用面向对象的方法'''

from tkinter import *
from tkinter import  messagebox
import webbrowser

class Application(Frame):
    '''一个经典的Gui的类的写法'''

    def __init__(self,master=None):
        super().__init__(master)   #super()代表的是父类的定义,而不是父类对象
        self.master = master
        self.pack()
        self.createWideget()

    def createWideget(self):
        '''创建登录组件'''
        self.w1 = Text(root, width=40, height=12, bg="gray")
        #宽度20个字母(10个汉字),高度一个行高
        self.w1.pack()

        self.w1.insert(1.0, "0123456789\nabcdefg")
        self.w1.insert(2.3, "嘤嘤嘤嘤嘤嘤嘤嘤嘤\n")

        Button(self, text="重复插入文本", command=self.insertText).pack(side="left")
        Button(self, text="返回文本", command=self.returnText).pack(side="left")
        Button(self, text="添加图片", command=self.addImage).pack(side="left")
        Button(self, text="添加组件", command=self.addWidget).pack(side="left")
        Button(self, text="通过tag精确控制文本", command=self.testTag).pack(side="left")

    def insertText(self):
        # INSERT索引表示在光标处插入
        self.w1.insert(INSERT, 'GAOqi')
        #END索引表示在最后插入
        self.w1.insert(END, '[sxt]')

    def returnText(self):
        # Index(索引)是用来指向Text组件中的文本的位置,Text的组件索引也是对应实际字符之间的位置
        # 核心:行号以1开始,列号以0开始
        print(self.w1.get(1.2, 1.6))
        self.w1.insert(1.8, "gaoqi")
        print("所有文本内容:\n"+self.w1.get(1.0, END))

    def addImage(self):
        # global photo
        self.photo = PhotoImage(file="img/2.gif")
        self.w1.image_create(END,image=self.photo)

    def addWidget(self):
        b1 =Button(self.w1, text='DNSscan')
        #在text创建组件的命令
        self.w1.window_create(INSERT, window=b1)

    def testTag(self):
        self.w1.delete(1.0, END)
        self.w1.insert(INSERT, "dnsSCAN\ndnsscan------>\n[+]")
        self.w1.tag_add("good", 1.0, 1.9)
        self.w1.tag_config("good", background="yellow", foreground="red")

        self.w1.tag_add("baidu", 4.0, 4.2)
        self.w1.tag_config("baidu", underline=True)
        self.w1.tag_bind("baidu", "<Button-1>", self.webshow)

    def webshow(self, event):
        webbrowser.open("http://www.baidu.com")


if __name__ == '__main__':
    root = Tk()
    root.geometry("500x400+200+300")
    root.title("测试Text多行文本组件")
    app = Application(master=root)
    root.mainloop()


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

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

相关文章

biaffine model:Named Entity Recognition as Dependency Parsing

论文名称&#xff1a;Named Entity Recognition as Dependency Parsing 论文地址&#xff1a;https://www.aclweb.org/anthology/2020.acl-main.577/ 前提说明 本文主要参考了以下资料 nlp_paper_study_information_extraction/code_pytorch.md at main km1994/nlp_paper_s…

ASEMI肖特基二极管SBT40100VFCT规格,SBT40100VFCT封装

编辑-Z ASEMI肖特基二极管SBT40100VFCT参数&#xff1a; 型号&#xff1a;SBT40100VFCT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;100V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#…

使用kubeadm搭建高可用集群-k8s相关组件及1.16版本的安装部署

本文是向大家分享k8s相关组件及1.16版本的安装部署&#xff0c;它能够让大家初步了解k8s核心组件的原理及k8s的相关优势&#xff0c;有兴趣的同学可以部署安装下。 什么是kubernetes kubernetes是Google 开源的容器集群管理系统&#xff0c;是大规模容器应用编排系统&#xff…

ubuntu下jupyter notebook设置远程访问

1. 安装anaconda 推荐安装anaconda&#xff0c;安装后就会包含jupyter notebook 使用命令conda list或者pip list查看jupyter notebook包&#xff0c;这里不多介绍 2. 生成默认配置文件 在ubuntu环境下&#xff0c;安装jupyter notebook后&#xff0c;用户主目录中会有一个…

DRU-Net--一种用于医学图像分割的高效深度卷积神经网络

Title:DRU-NET: AN EFFICIENT DEEP CONVOLUTIONAL NEURAL NETWORK FOR MEDICAL IMAGE SEGMENTATION 摘要 本文的网络结构是受ResNet和DenseNet两个网络的启发而提出的。与ResNet相比本文的方法增加了额外的跳跃连接&#xff0c;但使用的模型参数要比DenseNet少的多。 基于先…

【创建型设计模式-单例模式】一文搞懂单例模式的使用场景及代码实现的7种方式(全)

1.什么是单例模式 在了解单例模式前&#xff0c;我们先来看一下它的定义&#xff1a; 确保一个类只有一个实例&#xff0c;而且自行实例化并且自行向整个系统提供这个实例&#xff0c;这个类称为单例类&#xff0c;它提供全局访问的方法&#xff0c; 单例模式是一种对象的创建型…

北京东物流,南顺丰速运

配图来自Canva可画 众所周知&#xff0c;“双11”是一年一度的物流高峰期&#xff0c;但2022年“双11”当日快递业务量并未达到预期水平&#xff0c;全年增速创下新低。据了解&#xff0c;“双11”当日业务量为5.52亿件&#xff0c;同比下滑了20.69%&#xff0c;而11月1日至11…

什么是CISAW认证?有什么价值?

随着信息技术的快速发展和信息化应用的不断深入&#xff0c;信息技术、产品及网络已经融入社会经济生活的方方面面&#xff0c;但同时信息安全问题也越来越突出。面对严峻的信息安全形势&#xff0c;我国将信息安全上升至国家战略&#xff0c;相继出台了一系列政策法规。那大家…

IDEA好用插件推荐

一、MavenHelper 当Maven Helper 插件安装成功后&#xff0c;打开项目中的pom文件&#xff0c;下面就会多出一个试图Dependency Analyzer 切换到此试图即可进行相应操作&#xff1a; Conflicts&#xff08;查看冲突&#xff09;All Dependencies as List&#xff08;列表形式…

数据仓库规范

模型设计 模型设计概述 为什么需要模型设计&#xff1f; Linux 的创始人 Torvalds 有 一段关于“什么才是优秀程序员”的话:“烂程序员关心的是代码&#xff0c;好程序员关心的是数据结构和它们之间的关系”&#xff0c;其阐述了数据模型的重要性。有了适合业务和基础数据存…

python 中__init__ 作用

__init__的作用&#xff1a; &#xff08;1&#xff09;声明包 &#xff08;2&#xff09;预加载模块内容 &#xff08;1&#xff09;声明包 python项目结构中&#xff0c;普通目录下无__init__文件&#xff1b;而包下是有__init__文件的。 python 项目结构是按目录来组织的…

R语言结课及Matlab开始

R语言结课 我们R语言的学习这节课下课就结束了&#xff0c;接下来进行Matlab的学习。下面我会说一下R的结课任务及如何考试&#xff0c;以及我自己整理的Matlab安装教程。 R的结课作业&#xff1a;周二上课时提到的两个回归模型课程总结&#xff08;老师说作业总结主要是作业…

如何运用java代码操作Redis

目录 1、java如何连接Redis&#xff1f; 1.1.启动Redis服务 1.2.导入相关Redis依赖 1.3.java代码进行连接 2、java连接Redis 2.1.String 2.1.1.设值 2.1.2.拿值 2.1.3.删除 2.1.4.修改 2.1.5.给键值对设置过期时间 2.1.6.获取键值对剩余的存活时间 2.2.哈希&#xff08;Hash&a…

jacoco单测报告怎么同步到sonarqube

sonarqube支持多种代码覆盖率的报告展示&#xff0c;最常用的当属jacoco报告&#xff0c;那么jacoco的报告怎么同步到我们的sonarqube中呢&#xff1f; 我们先看看jacoco的offline模式&#xff08;单元测试&#xff09;报告生成的流程 根据上图我们需要生成单测报告&#xff0…

Apollo 应用与源码分析:CyberRT-工具与命令

概念 cyberRT包括一个可视化工具cyber_visualizer和两个命令行工具cyber_monitor和cyber_recorder。 注意&#xff1a;使用这些工具需要apollo docker环境 并且Cyber RT 中提供了一些命令工具&#xff0c;可以方便快捷的解决上述问题&#xff0c;本部分内容就主要介绍这些命…

Clion学习

看看Cmake是个什么&#xff1f; 他是个构建管理工具 一个比较OK的图 cmake_minimum_required(VERSION 3.15)#指定了最小的Cmake版本 project(jcdd)#指定了项目名称 set(CMAKE_CXX_STANDARD 14) add_executable(jcdd main.cpp)#输出可执行文件的名称安装第三方库&#xff…

图解来啦!机器学习工业部署最佳实践!10分钟上手机器学习部署与大规模扩展 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 机器学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/41 &#x1f4d8; 深度学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/42 &#x1f4d8; 本文地址&#xff1a;https://www.sho…

【MyBatis】动态SQL

if标签 CarMapper.java /*** 多条件查询* param brand 品牌* param guidePrice 指导价* param carType 汽车类型* return*/List<Car> selectByMultiCondition(Param("brand") String brand,Param("guidePrice") Double guidePrice,Param("car…

MySQL基础篇之MySQL概述

01、MySQL概述 1.1、数据库相关概念 1、数据库相关概念 名称解释说明简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Management System&#xff08;DBMS&#xff09;SQL…

ky使用教程(基于fetch的小巧优雅js的http客服端)

1.前言 react项目更加倾向于使用原生的fetch请求方式&#xff0c;而ky正是底层使用fetch的api做请求。github星数是8.2K&#xff0c;源码地址是&#xff1a;GitHub - sindresorhus/ky: &#x1f333; Tiny & elegant JavaScript HTTP client based on the browser Fetch A…