Python 图形用户界面详解(GUI,Tkinter)

文章目录

  • 1 概述
    • 1.1 TK:窗口
    • 1.2 官方文档
  • 2 组件
    • 2.1 Label:标签
    • 2.2 Button:按钮
    • 2.3 Entry:输入
    • 2.4 Text:文本
    • 2.5 Radiobutton:单选框
    • 2.6 Checkbutton:复选框
    • 2.7 Canvas:画布
    • 2.10 Menu:菜单
  • 3 布局管理器
    • 3.1 pack:包
    • 3.2 grid:网格
    • 3.3 place:位置

1 概述

1.1 TK:窗口

import tkinter

# 定义窗口对象
window = tkinter.Tk()

# 设置窗口属性
window.title('我的第一个 GUI 程序')  # 标题
window.geometry('300x100+300+200')  # 位置及大小
# 格式:'wxh +-x +-y',其中
# wxh:表示 宽x高(字母 xyz 的 x)
#  +x:表示距屏幕左边的距离;-x 表示距屏幕右边的距离
#  +y: 表示距屏幕上边的距离;-y 表示距屏幕下边的距离

# 主循环:窗口一直存在(除非被关闭)
window.mainloop()

1.2 官方文档

  • 官方文档:https://docs.python.org/3.9/library/tk.html

2 组件

2.1 Label:标签

菜单结构:
在这里插入图片描述

from tkinter import *


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.label01 = Label(self, text="标签1", width=10, height=2, bg="black", fg="white")
        self.label01.pack()

        self.label02 = Label(self, text="标签2", width=10, height=2, bg="blue", fg="white", font=("黑体", 20))
        self.label02.pack()

        # 显示文本
        self.label03 = Label(self, text="段落1\n段落段落2\n段落段落段落3", borderwidth=1, relief="solid", justify="right")
        self.label03.pack()

        # 显示图片
        global photo
        photo = PhotoImage(file="images/1.gif")  # 暂支持的图片格式:png、gif
        self.label04 = Label(self, image=photo)
        self.label04.pack()


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

    window.mainloop()

效果预览:
在这里插入图片描述

2.2 Button:按钮

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        # 常规按钮
        self.btn01 = Button(self, text="登录", command=self.login)
        self.btn01.pack()

        self.btn02 = Button(self, text="登录2", command=self.login)
        self.btn02.config(state="disabled")  # 禁止登录
        self.btn02.pack()

        # 图片按钮
        global photo
        photo = PhotoImage(file="images/1.gif")
        self.btn03 = Button(self, image=photo, command=self.login)
        self.btn03.pack()

    def login(self):
        messagebox.showinfo("提示", "登录成功!")


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

    window.mainloop()

效果预览:
在这里插入图片描述

2.3 Entry:输入

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

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

        user_name = StringVar()
        self.entry01 = Entry(self, textvariable=user_name)
        self.entry01.pack()

        self.label02 = Label(self, text="密码")
        self.label02.pack()

        password = StringVar()
        self.entry02 = Entry(self, textvariable=password, show="*")
        self.entry02.pack()

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

    def login(self):
        user_name = self.entry01.get()
        password = self.entry02.get()

        if user_name == 'admin' and password == '123456':
            messagebox.showinfo("提示", "登录成功!")
        else:
            messagebox.showinfo("提示", "登录失败,请检查用户名或密码!")


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

    window.mainloop()

效果预览:
在这里插入图片描述

2.4 Text:文本

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.text01 = Text(self, width=40, height=10, bg="gray")
        self.text01.pack()

        # 插入文本,格式:横坐标.纵坐标
        self.text01.insert(1.0, 'aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbb')
        self.text01.insert(2.3, 'cccccccccccccccc\neeeeeeeeeeeee')

        Button(self, text="重复插入文本", command=self.insert_text).pack(side="left")

    def insert_text(self):
        self.text01.insert(INSERT, '鼠标光标处插入')
        self.text01.insert(END, '文本最后处插入')


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

    window.mainloop()

效果预览:
在这里插入图片描述

2.5 Radiobutton:单选框

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.default = StringVar()
        self.default.set("F")
        rb1 = Radiobutton(self, text="男性", value="M", variable=self.default)
        rb2 = Radiobutton(self, text="女性", value="F", variable=self.default)

        rb1.pack(side="left")
        rb2.pack(side="left")

        Button(self, text="确定", command=self.confirm).pack()

    def confirm(self):
        messagebox.showinfo("提示", "选择的性别的是:" + self.default.get())


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

    window.mainloop()

在这里插入图片描述

2.6 Checkbutton:复选框

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.code = IntVar()
        self.video = IntVar()
        print(self.code.get())  # 整数默认值是 0

        # onvalue=1, offvalue=0 表示:选中=1,未选中=0
        cb1 = Checkbutton(self, text="敲代码", variable=self.code, onvalue=1, offvalue=0)
        cb2 = Checkbutton(self, text="看视频", variable=self.video, onvalue=1, offvalue=0)

        cb1.pack(side="left")
        cb2.pack(side="left")

        Button(self, text="确定", command=self.confirm).pack()

    def confirm(self):
        if self.code.get() == 1:
            messagebox.showinfo("提示", f"已选中【敲代码】")
        if self.video.get() == 1:
            messagebox.showinfo("提示", f"已选中【看视频】")


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

    window.mainloop()

效果预览:
在这里插入图片描述

2.7 Canvas:画布

from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        canvas = Canvas(self, width=300, height=200)
        canvas.pack()
        # 画一条直线。以 横坐标,纵坐标 两个为一组
        canvas.create_line(10, 10, 30, 20, 40, 50)
        # 画一个矩形。
        canvas.create_rectangle(50, 50, 100, 100)
        # 画一个椭圆
        canvas.create_oval(50, 50, 100, 100)


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

    window.mainloop()

预览效果:
在这里插入图片描述

2.10 Menu:菜单

from tkinter import *


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        menubar = Menu(self.master)

        # 创建一级菜单
        file_menu = Menu(menubar, tearoff=0)
        file_menu.add_command(label='打开')
        file_menu.add_command(label='新建')
        menubar.add_cascade(label="文件", menu=file_menu)

        # 创建二级菜单(三级菜单同理)
        edit_menu = Menu(file_menu, tearoff=0)
        edit_menu.add_command(label="修改")
        edit_menu.add_command(label="保存")
        file_menu.add_cascade(label="编辑", menu=edit_menu)

        # 将菜单加至主窗体中
        self.master.config(menu=menubar)


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

    window.mainloop()

效果预览:
在这里插入图片描述

3 布局管理器

布局管理器布局方式
pack水平、竖直
grid表格
place位置

3.1 pack:包

选项说明取值范围
side停靠方向top(上)、botton(下)、left(左)、right(右)
fill填充方式x(水平)、y(垂直)、both(水平+垂直)、none(不填充)
expand扩大方式True(随主窗体的大小变化)、False(不随主窗体变化)
anchor方向N(北)、S(南)、W(西)、E(东)、Center(中心) 等
ipandx、ipandy内边距非负整数
padx、pady外边距非负整数
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        Button(self, text='A').pack(side=LEFT, expand=YES, fill=Y)
        Button(self, text='B').pack(side=TOP, expand=YES, fill=BOTH)
        Button(self, text='C').pack(side=RIGHT, expand=YES, fill=NONE)
        Button(self, text='D').pack(side=LEFT, expand=NO, fill=Y)
        Button(self, text='E').pack(side=TOP, expand=YES, fill=BOTH)
        Button(self, text='F').pack(side=BOTTOM, expand=YES)
        Button(self, text='G').pack(anchor=SE)


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

    window.mainloop()

效果预览:
在这里插入图片描述

3.2 grid:网格

选项说明取值范围
row单元格的行数从 0 开始的正整数
rowspan跨行,跨越的行数正整数
column单元格的列号从 0 开始的正整数
columnspan跨列,跨越的列数正整数
ipandx,ipandy子组件之间的间隔,按x、y 方向非负浮点数,默认 0.0
pandx,pandy并列组件之间的间隔,按x、y 方向非负浮点数,默认 0.0
sticky组件紧贴所在单元格的某一个角,如:东西南北等n、s、w、e、nw、sw、se、ne、center(默认)
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        self.label01 = Label(self, text="用户名")
        self.label01.grid(row=0, column=0)
        self.entry01 = Entry(self)
        self.entry01.grid(row=0, column=1)

        Label(self, text="密码").grid(row=1, column=0)
        Entry(self, show="*").grid(row=1, column=1)


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

    window.mainloop()

效果预览:
在这里插入图片描述

3.3 place:位置

选项说明取值范围
x,y组件左上角的绝对坐标(相对于窗口)非负整数
relx,rely组件左上角的相对坐标(相对于父容器)0=最左边,0.5=正中间,1=最右边
width,height组件的宽度和高度(相对于窗口)
relwidth,relheight组件的宽度和高度(相对于父容器)
anchor对齐方式n、s、w、e、nw、ne、sw、se、center(默认)
from tkinter import *
from tkinter import messagebox


class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)  # 父类的定义
        self.master = master
        self.pack()
        self.create_widget()

    def create_widget(self):
        """创建组件"""
        Button(self.master, text='A').place(x=0, y=0)
        Button(self.master, text='B').place(x=100, y=100, width=100, height=50)


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

    window.mainloop()

效果预览:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

skywalking告警qq邮箱发送

首先开启发送接收qq邮箱的权限 开启之后&#xff0c;会让你发送信息&#xff0c;按着一系列操作&#xff0c;获得password &#xff08;授权码&#xff08;例如&#xff0c;qq开启SMTP授权码&#xff0c;qq授权码16位&#xff09;&#xff09; <!-- mail邮箱-->…

基于STM32单片机的智能家居系统设计(论文+源码)

1.系统设计 基于STM32单片机的智能家居系统设计与实现的具体任务&#xff1a; &#xff08;1&#xff09;可以实现风扇、窗帘、空调、灯光的开关控制&#xff1b; &#xff08;2&#xff09;具有语音识别功能&#xff0c;可以通过语音控制家电&#xff1b; &#xff08;3&a…

第二证券:机构密集调研消费电子、半导体产业链

据上海证券报记者核算&#xff0c;近一个月来&#xff0c;共有41家消费电子类公司和92家半导体公司&#xff08;核算标准&#xff1a;申万职业2021&#xff0c;下同&#xff09;发布出资者调研纪要。其间&#xff0c;有的公司款待了16个批次估计超200家安排&#xff0c;更有公司…

Java零基础——docker篇

1.【熟悉】docker简介 1.1 什么是docker Docker是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache2.0协议&#xff0c;项目代码在GitHub上进…

Sectigo通配符证书

Sectigo通配符证书&#xff08;Wildcard SSL Certificate&#xff09;是一种特殊类型的SSL证书&#xff0c;它适用于一个主域名及其所有子域名。这意味着&#xff0c;只要子域名在主域名下&#xff0c;就可以使用同一张通配符证书进行加密保护。这为拥有多个子域名的网站提供了…

ICC2/innovus设置no 1x gap的方法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2设置no 1x的方法如下: 1) set_placement_spacing_label -name X -lib_cells {*} -side right set_placement_spacing_label -name Y -lib_cells {*} -side left 2) set_placement_spacing_rul…

【黑马甄选离线数仓day07_常见优化手段及核销主题域开发】

1.常见优化手段 1.1 分桶表基本介绍 分桶表: 分文件的, 在创建表的时候, 指定分桶字段, 并设置分多少个桶, 在添加数据的时候, hive会根据设置分桶字段, 将数据划分到N个桶(文件)中, 默认情况采用HASH分桶方案 , 分多少个桶, 取决于建表的时候, 设置分桶数量, 分了多少个桶最终…

第二证券:燃料电池产业进入发展快车道 多家公司披露布局进展

据悉&#xff0c;日前太原钢铁&#xff08;集团&#xff09;有限公司初次开发出超级超纯铁素体TFC22-X连接体材料并结束了批量供货&#xff0c;填补了国内空白。 燃料电池电堆连接体材料是行业中最为要害的战略材料。研发团队打破了特别元素含量精确操控的要害技术瓶颈&#x…

漏洞扫描-德迅云安全漏洞扫描服务

漏洞扫描是指基于漏洞数据库&#xff0c;通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测&#xff0c;发现可利用漏洞的一种安全检测的行为。 漏洞扫描的主要目的是发现系统、网络或应用程序中可能存在的安全漏洞和缺陷&#xff0c;以便及时修复这些漏洞和缺…

VMware通过ISO镜像安装window2016虚拟机

1.点文件->新建虚拟机 2.进入到下边页面 3.根据你的服务器硬件选择硬件兼容性 4.选择2016版本的windows(注&#xff1a;没有该版本的话选择最高版本) 5.根据你的需求选择引导设备( 启动过程&#xff1a; BIOS&#xff1a; 在计算机启动时&#xff0c;BIOS负责进行自检&#…

vue建立组件无校验版

实现功能&#xff1a; 切换&#xff0c;相当于tab 1、非组件代码&#xff1a; <template><div><div class"tabStyle"><div v-for"(item,index) in tabTitle" :key"index" class"bordItemStyle" :class"c…

vue.draggable拖拽——岗位切换如何判断?

有一个业务场景&#xff1a;把一个单位的某个岗位的人&#xff0c;从某某市A岗位调离出来后&#xff0c;又拖拽回去&#xff0c;如果是回到某某市A岗位&#xff0c;则没有变化&#xff0c;若是换了岗位&#xff0c;则会把色块变成红色&#xff0c;表示岗位的变化。 方法一&…

idea下载与安装,以及创建一个项目写HelloWorld

1.idea下载 Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) Ultimate为旗舰版&#xff0c;功能全面&#xff0c;插件丰富&#xff0c;按年收费。 Community为社区版&#xff0c;免费试用&#xff0c;功能相对而言不是很丰富&#xff0c;但是不影…

Mysql单表查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10…

【Rust】基本的语法概念

Rust初学习 常见概念变量与可变性变量常量隐藏 数据类型标量类型字符类型复合类型元组数组 函数参数语句和表达式具有返回值的函数 注释控制流使用循环重复执行 常见概念 变量与可变性 变量 fn main() {let x 5;println!("The value of x is: {x}");x 6;println…

JS异常处理——throw和try、catch以及debugger

让我为大家介绍一下异常处理吧&#xff01; 异常处理是指预估代码执行过程中可能发生的错误&#xff0c;然后最大程度的避免错误的发生导致整个程序无法继续运行 throw 抛异常 第一种写法 function fun(x, y) {// undefined是false 但取反就是trueif (!x || !y) {// 第一种写…

IMO国际奥林匹克数学竞赛推出AI-MO,奖金高达1000万美元; SDXL Turbo: 新一代文本到图像模型

&#x1f989; AI新闻 &#x1f680; IMO国际奥林匹克数学竞赛推出AI-MO&#xff0c;奖金高达1000万美元 摘要&#xff1a;IMO国际奥林匹克数学竞赛推出新的AI竞赛AI-MO&#xff0c;旨在推动大语言模型的数学推理能力&#xff0c;鼓励开发能与人类数学天才相媲美的AI模型。比…

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control

【论文阅读笔记】Prompt-to-Prompt Image Editing with Cross-Attention Control 个人理解思考基本信息摘要背景挑战方法结果 引言方法论结果讨论引用 个人理解 通过将caption的注意力图注入到目标caption注意力中影响去噪过程以一种直观和便于理解的形式通过修改交叉注意力的…

二分查找(Java)

二分查找&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。其基本思想是每次将查找范围缩小一半&#xff0c;直到找到目标元素或确定目标元素不存在。 以下是二分查找的详细步骤&#xff1a; 初始化左右边界&#xff1a;将初始查找范围设置…

台灯怎么选对眼睛好?适合考研使用的护眼台灯推荐

现在晚上仍然需要工作、学习的人有很多&#xff0c;这样的一件事似乎已经成为“家常便饭”&#xff0c;尤其事对于一些学生党而言。每天都有写不完的作业、做不完的功课&#xff0c;这样高强度的用眼下来&#xff0c;容易导致眼睛疲劳、近视等等。很多人会选择在夜晚的时候使用…