python从入门到实践————图形界面(上)

news2024/11/23 20:23:05

系列文章目录


`

文章目录

  • 系列文章目录
  • 前言
  • 窗体组件
  • 窗体显示
      • 显示窗体
      • 文本显示
  • 项目实践
  • 总结


前言

图形用户接口(Graphical User Interface,GUI)是人机交互的重要技术手段,在Python中利用tkinter模块就可以方便地实现图形界面。
在你python中,除了本次要讲的tkinter模块,还有wxPython,PyQt5模块,以及与Java图形界面组件衔接的Jpython模块。由于图形编程一般都是单机版程序,而Python技术的发展重点并不在此,所以这里就只简单的介绍tkinter模块。

窗体组件

序号组件描述
1Button按钮组件,在界面中显示一个按钮
2Canvas画布组件,在界面中显示一个画布,而后在此画布上进行绘画
3Checkbutton多选框组件,可以实现多个选项的选定
4Entry输入控件,用于显示简单的文本内容
5Frame框架控件,在进行排版时实现子排版模型
6Label标签组件,可以显示文字或图片信息
7Listbox列表框组件,可以显示多个列表项
8Menu菜单组件,在界面上端显示菜单栏,下拉菜单或弹出菜单
9Menubutton菜单按钮组件,为菜单定义菜单项
10Message消息组件,用来显示提示信息
11Radiobutton单选按钮组件,可以实现单个菜单项的选定
12Scale滑动组件,设置数值的可用范围,通过滑动切换数值
13Scrollbar滑动条组件,为外部包装组件,当有多个内容显示不下时,可以出现滚动条
14Text文本组件,可以实现文本或图片信息的提示
15Toplevel容器组件,可以实现对话框
16Spinbox输入组件,与Entry对应,可以设置数据输入访问
17PanedEindow窗口布局组件,可以在内部提供一个子容器实现子窗口定义
18LabelFrame容器组件,实现复杂组件布局
19tkMessageBox消息组件,可以进行提示框的显示

窗体显示

任何一个图形界面都会包含有一个主窗体,在主窗体内可以设置不同的组件,在tkinter模块中提供了Tk类,该类可以负责窗体的创建以及相关的属性定义。tkinter.Tk类中提供的常用方法如表

序号方法描述
1def title(self,string=None)设置窗体显示标题
2def iconbitmap(self,bitmap=None,default=None)设置窗体LOGO
3def geometry(self,newGeometry=None)设置窗体大小
4def minsize(self,width=None,height=None)设置窗体最小化尺寸
5def maxsize(self,width=None,height=None)设置窗体最大化尺寸
6def mainloop(self,n=0)界面循环及时显示窗体变化

显示窗体

import tkinter
import os
LOGO_PATH='./123.png'
IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        root=tkinter.Tk() #创建窗体;
        root.title('one.py')
        root.iconbitmap(LOGO_PATH) #设置窗体图标
        root.geometry("500x600")  #设置窗体大小,这里的x是小写的x,不是乘号;
        root.maxsize(1000,400)
        root.minsize(200,50)
        root['background']='LightSlateGray' #设置背景颜色;
        label_text=tkinter.Label(root,text='2023继续加油;',width=200,height=100,bg='#223011',
            font=('宋体',20),justify='right')
        photo=tkinter.PhotoImage(file=IMAGE_PATH)
        label_photo=tkinter.Label(root,image=photo)
        label_photo.pack()#图片标签展示;
        label_text.pack()
        root.mainloop()  #界面循环监听;
def main():
    MainForm()
if __name__=='__main__':
    main() 

        

结果显示:
在这里插入图片描述

文本显示

# coding:用户界面GUI
import tkinter,os
import time
IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        root=tkinter.Tk()  #创建窗体;
        root.geometry("500x400")  #窗口的大小
        root.title('用户界面的设计')
        root.maxsize(1000,600)
        root['background']='LightSlateGray'
        Text=tkinter.Text(root,width=20,height=50,font=('宋体',20))
        Text.insert('current',"加油!")#在光标处插入数据;
        Text.insert('end',"追梦人")
        photo=tkinter.PhotoImage(file=IMAGE_PATH) #加载图片;
        Text.image_create("end",image=photo)#图片的设置;
        Text.pack() #循环监听;
        root.mainloop()
def main():
    MainForm()
if __name__=='__main__':
    main()

结果显示:
在这里插入图片描述
由于界面编程主要就是函数的使用,没法过多的介绍,函数的使用已经做了注释。这里就简单的对两个函数的使用作了介绍。

项目实践

由于函数太多,每个都介绍所需篇幅过长,这里以一个项目来对函数使用做介绍。项目已经打包成exe文件放在了资源中。有兴趣可以去尝试。
源代码:

#coding:Frame事件
import tkinter,os,tkinter.messagebox
#在同一个界面中,由于我们可能需要不同的组件,不同的组件需要的页面布局也是不一样的
#Frame可以使页面分成多个子页面,每个子页面都可以使用不同的布局方式
import re
#IMAGE_PATH='./123.png'
class MainForm:
    def __init__(self) -> None:
        self.__root=tkinter.Tk() #创建窗体
        self.__root.title('计算器')
        self.__root.geometry('231x280')
        #self.__photo=tkinter.PhotoImage(file=IMAGE_PATH)
        self.__root['background']='Ligh tSlateGray'
        self.input_frame() #显示输入Frame
        self.button_frame() #显示按钮组件
        self.__root.protocol('WM_DELETE_WINDOW',self.close_handle)
        self.__root.mainloop() #循环监听
    def close_handle(self):
        if tkinter.messagebox.askyesnocancel('计算器关闭确认','确定要关闭计算器'):
            self.__root.destroy()
    def input_frame(self): #输入和回显文本
        self.input_frame=tkinter.Frame(self.__root,width=20) #定义Frame
        self.content=tkinter.StringVar() #修改数据
        self.entry=tkinter.Entry(self.input_frame,width=14,font=('微软雅黑',20),textvariable=self.content)#定义输入框
        self.entry.pack(fill='x',expand=1)#文本显示
        self.clean=False  #设置清除标记
        self.input_frame.pack(side='top') #Frame显示
    def button_frame(self):
        self.button_frame=tkinter.Frame(self.__root,width=50)#创建Frame
        self.button_list=[[],[],[],[]]#定义按钮组件
        self.button_list[0].append(tkinter.Button(self.button_frame,text='1',fg='black',width=3,font=('微软雅黑',20)))#计算器按键1
        self.button_list[0].append(tkinter.Button(self.button_frame,text='2',fg='black',width=3,font=('微软雅黑',20))) #计算器按键2
        self.button_list[0].append(tkinter.Button(self.button_frame,text='3',fg='black',width=3,font=('微软雅黑',20))) #计算器按键3
        self.button_list[0].append(tkinter.Button(self.button_frame,text='+',fg='black',width=3,font=('微软雅黑',20))) #计算器按键+
        self.button_list[1].append(tkinter.Button(self.button_frame,text='4',fg='black',width=3,font=('微软雅黑',20))) #计算器按键4
        self.button_list[1].append(tkinter.Button(self.button_frame,text='5',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[1].append(tkinter.Button(self.button_frame,text='6',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[1].append(tkinter.Button(self.button_frame,text='-',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='7',fg='black',width=3,font=('微软雅黑',20))) 
        self.button_list[2].append(tkinter.Button(self.button_frame,text='8',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='9',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[2].append(tkinter.Button(self.button_frame,text='*',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='0',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='.',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='=',fg='black',width=3,font=('微软雅黑',20)))
        self.button_list[3].append(tkinter.Button(self.button_frame,text='/',fg='black',width=3,font=('微软雅黑',20)))
        self.row=0#布局行控制
        for group in self.button_list:
            self.column=0#布局列控制
            for button in group:#获取按钮组中的按钮
                button.bind("<Button-1>",lambda event:self.button_handle(event))  #绑定事件
                button.grid(row=self.row,column=self.column)#grid布局
                self.column+=1 #修改布局列
            self.row+=1 #修改布局行
            self.button_frame.pack(side='bottom') #pack布局
    def button_handle(self,event): 
        oper=event.widget['text'] #获得当前操作符
        if self.clean:
            self.content.set("")#删除输入框数据
            self.clean=False#修改清除标记
        if oper !='=':
            self.entry.insert('end',oper)
        elif oper=='=':
            result=0
            exp=self.entry.get()  #获得输入表达式数据
            nums=re.split(r"\+|\-|\*|\\",exp) #获得输入的两个数据
            pattern=r"\+|\-|\*|\\"  #操作符提取准则
            flag=re.findall(pattern,exp)[0]  #获取操作符
            if flag=='+':
                result=float(nums[0])+float(nums[1]) #加法运算
            elif flag=='-':
                result=float(nums[0])-float(nums[1])
            elif flag=='*':
                result=float(nums[0])*float(nums[1])
            elif flag=='/':
                result=float(nums[0])/float(nums[1])
            self.entry.insert('end',"=%s" % result)
            self.clean=True
def main():
    MainForm()
if __name__=='__main__':
    main()

在这里插入图片描述

总结

图形界面编程本身就是一个单机程序,不是Python的重点学习项目,所以博主也只对tkinter模块进行了介绍,GUI编程,后面会继续介绍。

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

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

相关文章

每日一题:Leetcode203 移除链表元素

文章目录 系列&#xff1a;链表专练 语言&#xff1a;java & go 题目来源&#xff1a;Leetcode203 移除链表元素 难度&#xff1a;简单 考点&#xff1a;头结点 && 虚拟头结点 思路和参考答案文章目录题目描述思路java参考代码go参考代码&#xff1a;题目描述 给…

xcelium——重要特性——提高编译仿真性能

以下图片来自于CadenceTECHTALK研讨会 解决编译仿真的瓶颈问题&#xff0c;提高整体性能 影响performance的因素 xcelium版本access rwccoverage收集snapshot过大&#xff0c;加载时间过长&#xff0c;可通过Zlib加快加快snapshot加载 编译/仿真添加选项&#xff1a; -new…

如何检查自己电脑是否被攻击了?

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 通过系统命令排查账户安全 query user # 查看当前登录账户 lo…

21.字符串的概念,字符串的可修改性

字符串和指针 字符串的概念&#xff1a; 字符串就是以 ‘\0’ 结尾的若干字符的集合。字符串的地址&#xff0c;是第一个字符的地址。可以定义一个字符指针变量保存字符串的地址。比如&#xff1a; char* shelloworld"; 字符串的存储形式&#xff1a;数组、文字常量区、…

靶机测试haclabs-no_name

靶机地址https://www.vulnhub.com/entry/haclabs-no_name,429/靶机测试nmap扫描└─$ nmap -T5 -A 192.168.1.100 -oA hl-portsStarting Nmap 7.92 ( https://nmap.org ) at 2023-01-12 11:16 CST Nmap scan report for 192.168.1.100 Host is up (0.00040s latency). Not show…

获工信部认可!腾讯牵头的《零信任系统技术规范》入选工信部百项团标应用示范

近日&#xff0c;工信部发布《关于公布2022年团体标准应用示范项目的通告》&#xff0c;由腾讯安全牵头起草&#xff0c;公安部第三研究所、国家计算机网络应急技术处理协调中心、中国移动设计院等业内16家零信任厂商、测评机构及用户联合编制的中国第一部《零信任系统技术规范…

Webpack搭建本地服务器

1、开启本地服务器 1.1、为什么要搭建本地服务器&#xff1f; 目前我们开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码&#xff1b;操作二&#xff1a;通过live server或者直接通过浏览器&#xff0…

【ROS】—— 机器人系统仿真 —URDF语法 (十三)

文章目录前言1. 概述1.1 概念1.2 作用1.3 相关组件1.3.1 URDF1.3.2 RViz1.3.3 gazebo1.4 准备2. URDF集成Rviz基本流程2.1 创建功能包&#xff0c;导入依赖2.2 编写 URDF 文件2.3 在 launch 文件中集成 URDF 与 Rviz3. URDF语法详解3.1 robot3.2 link3.3 joint3.4 URDF练习3.5 …

Lock锁原理解析【Android进阶】

Lock锁原理解析【Android进阶】 Lock简介 Lock接口位于J.U.C下locks包内&#xff0c;其定义了Lock应该具备的方法。 Lock 方法签名&#xff1a; void lock()&#xff1a;获取锁&#xff08;不死不休&#xff0c;拿不到就一直等&#xff09;boolean tryLock()&#xff1a;获…

13.0、Linux-安装Tomcat、以及防火墙常用命令

13.0、Linux-安装Tomcat、以及防火墙常用命令 防火墙常用命令在本文最下方-> 安装 Tomcat -> 第一步&#xff1a;进入官网下载 Tomcat8 -> Apache Tomcat - Apache Tomcat 8 Software Downloads 第二步&#xff1a;将下载好的文件 通过 Xshell 和 Xftp 工具上传到 L…

前端面试题——React重点

文章目录React相关问题1. 函数式组件与Class组件有什么不同&#xff1f;2. 说说React的fiber架构&#xff1f;3. 协调4. 虚拟DOM (Virtual DOM)React相关问题 1. 函数式组件与Class组件有什么不同&#xff1f; 答&#xff1a; ① 函数式组件不需要继承&#xff0c;直接 “fun…

YUV 文件读取、显示、缩放、裁剪等操作教程

系列文章目录 文章目录系列文章目录前言一、Chroma subsampling二、读取 YUV 文件2.1 准备工作2.2 Planar 模式2.2.1 YUV420P 格式读取2.2.2 YUV422P 格式读取2.2.3 NV21 格式读取2.2.4 NV12 格式读取2.2.5 小结2.3 Packed 模式2.3.1 YUYV 格式读取2.3.2 小结三、SDL 显示 YUV …

自动化测试是什么?为什么要做自动化测试?

自动化测试是什么&#xff1f;相信对软件测试有一定了解的朋友都不会感到陌生。自动化测试正如字面上理解得那样&#xff0c;是一种自动完成测试工作的测试方式。虽然是说的自动化&#xff0c;但是也是需要测试员手动编写代码去完成测试工作。那么&#xff0c;为什么要做自动化…

【链表】leetcode19.删除链表的倒数第N个节点(C/C++/Java/Js)

leetcode19.删除链表的倒数第N个节点1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 JavaScript版本4 总结1 题目 题源链接 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2…

微服务了解

1、什么是微服务 微服务就是根据业务功能模块把一个单体的应用拆分成许多个独立的项目&#xff0c;每个项目完成一部分的业务功能&#xff0c;然后独立开发和部署。这些独立的项目就成为一个微服务。进而构成一个服务集群。 微服务个人理解就是将之前的单一服务架构&#xff…

【Python】词云之wordcloud参数全解析

写了一半&#xff0c;明天继续 目录一基础用法二、WordCloud类形参说明2.1 常用参数2.11 字体 font_path2.12 画布尺寸 width、hight2.13 比例&#xff08;缩放&#xff09;scale2.14 颜色 colormap2.15 颜色color_func2.16 组合频率collocations2.17 遮罩&#xff08;蒙版&…

SpringBoot(57) 整合Plumelog实现日志查询

文章目录一、前言二、docker-compose一键搭建日志服务docker-compose.yml三、SpringBoot整合Plumelog1、pom.xml2、application.yml3、logback-spring.xml4、启动项目记录日志四、本文案例demo源码一、前言 Plumelog 一个简单易用的java分布式日志组件 https://gitee.com/plum…

机器学习笔记之深度信念网络(三)贪心逐层预训练算法

机器学习笔记之深度信念网络——贪心逐层预训练算法引言回顾&#xff1a;深度信念网络的结构表示回顾&#xff1a;RBM\text{RBM}RBM叠加思想贪心逐层预训练算法引言 上一节介绍了深度信念网络模型的构建思想&#xff0c;本节将介绍后验概率求解——贪心逐层预训练算法。 回顾…

窥探Swift源码下的Array

本文字数&#xff1a;6730字预计阅读时间&#xff1a;15 分钟用最通俗的语言&#xff0c;描述最难懂的技术前情提要我在之前的文章一次遍历导致的崩溃中提到了&#xff0c;如果有机会会把相关的Swift集合源码阅读。首先对自己的开发和知识储备会有进一步的升华&#xff0c;另外…

Redis -- IO多路复用及redis6的多线程

都知道redis是通过单线程io多路复用来避免并发问题的&#xff0c;然后在redis6的时候redis引入了多线程&#xff0c;这里就来详细说说IO多路复用模型以及redis的多线程。 Redis 的 I/O 多路复用模型有效的解决单线程的服务端&#xff0c;使用不阻塞方式处理多个 client 端请求…