Python3学习第十二章 图形用户界面

news2025/2/21 20:57:53
#!usr/bin/env python  
# -*- coding:utf-8 _*-
""" 
@author:AIvision 
@file: lecture12.py 
@time: 2023/09/05 
"""
# 第十二章 图形用户界面
# 12.1 创建 GUI 示例应用程序
# 为演示Tkinter的用法,我将介绍如何创建一个简单的GUI应用程序。你的任务是编写一个简
# 单的程序,让用户能够编辑文本文件。这里并非要开发功能齐备的文本编辑器,而只想提供基本
# 的功能。毕竟这里的目标是演示基本的Python GUI编程机制。
# 这个微型文本编辑器的需求如下。
#  让用户能够打开指定的文本文件。
#  让用户能够编辑文本文件。
#  让用户能够保存文本文件。
#  让用户能够退出。
# 编写GUI程序时,绘制其用户界面草图通常很有帮助。图12-1显示了一个可满足前述文本编
# 辑器需求的简单布局。

# 12.1.1 初探
# 首先,必须导入tkinter。为保留其命名空间,同时减少输入量,可能需要将其重命名。
# import tkinter as tk
# 然而,如果你愿意,也可导入这个模块的所有内容。这不会有太大的害处。
# >>> from tkinter import *
# 我们将使用交互式解释器来做些初探工作。
# 要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。
# >>> top = Tk()
# 此时将出现一个窗口。在常规程序中,我们将调用函数mainloop以进入Tkinter主事件循环,
# 而不是直接退出程序。在交互式解释器中,不需要这样做,但你完全可以试一试。
# >>> mainloop()
# 解释器像是挂起了,而GUI还在运行。为了继续,请退出GUI并重启解释器。
# 有很多可用的控件,它们的名称各异。例如,要创建按钮,可实例化Button类。如果没有Tk
# 实例,创建控件也将实例化Tk,因此可不先实例化Tk,而直接创建控件。
# >>> from tkinter import *
# >>> btn = Button()
# 现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter
# 将它放在什么地方。我们将使用管理器pack——在最简单的情况下只需调用方法pack即可。
# >>> btn.pack()
# 控件包含各种属性,我们可以使用它们来修改控件的外观和行为。可像访问字典项一样访问
# 属性,因此要给按钮指定一些文本,只需使用一条赋值语句即可。
# >>> btn['text'] = 'Click me!'
# 至此,应该有一个类似于下面的窗口:

# # import tkinter as tk
# # 导入这个模块的所有内容
# from tkinter import *
# # 要创建GUI,可创建一个将充当主窗口的顶级组件(控件)。为此,可实例化一个Tk对象。
# top = Tk()
# # 调用函数mainloop以进入Tkinter主事件循环
# mainloop()
#
# btn = Button()
# # 现在这个按钮是不可见的——你需要使用布局管理器(也叫几何体管理器)来告诉Tkinter
# # 将它放在什么地方。我们将使用管理器pack
# btn.pack()
# # 控件包含各种属性,我们可以使用它们来修改控件的外观和行为。可像访问字典项一样访问
# # 属性,因此要给按钮指定一些文本,只需使用一条赋值语句即可。
# btn['text'] = 'Click me!'



# 给按钮添加行为也非常简单。
# >>> def clicked():
# ... print('I was clicked!')
# ...
# >>> btn['command'] = clicked
# 现在如果单击这个按钮,将看到指定的消息被打印出来。
# 可以不分别给属性赋值,而使用方法config同时设置多个属性。
# >>> btn.config(text='Click me!', command=clicked)
# 还可使用控件的构造函数来配置控件。
# >>> Button(text='Click me too!', command=clicked).pack()

# 12.1.2 布局
# 对控件调用方法pack时,将把控件放在其父控件(主控件)中。要指定主控件,可使用构造
# 函数的第一个可选参数;如果没有指定,将把顶级主窗口用作主控件,如下面的代码片段所示:
# Label(text="I'm in the first window!").pack()
# second = Toplevel()
# Label(second, text="I'm in the second window!").pack()
# Toplevel类表示除主窗口外的另一个顶级窗口,而Label就是文本标签。
# 没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中。
# 例如,下面的代码生成一个又高又窄的窗口,其中包含一列按钮:
# for i in range(10):
#  Button(text=i).pack()
# 所幸可调整控件的位置和拉伸方式。要指定将控件停靠在哪一条边上,可将参数side设置为
# LEFT、RIGHT、TOP或BOTTOM。要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、
# Y或BOTH。要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True。还有其他的
# 选项,如指定锚点和内边距的选项,但这里不会使用它们。要快速了解可用的选项,可执行如下
# 命令:
# >>> help(Pack.config)
# 还有其他的布局管理器,具体地说是grid和place,它们可能更能满足你的需求。与pack布局
# 管理器一样,要使用它们,可对控件调用方法grid和place。为避免麻烦,在一个容器(如窗口)
# 中应只使用一种布局管理器。
# 方法grid让你能够这样排列控件:将它们放在不可见的表格单元格中。为此需要指定参数row
# 和column,还可能要指定参数rowspan或columnspan——如果控件横跨多行或多列。方法place让
# 你能够手工放置控件——通过指定控件的x和y坐标以及高度和宽度来做到。这在大多数情况下都
# 是馊主意,但偶尔可能需要这样做。这两个几何体管理器都还有其他的参数,要详细了解,可使
# 用如下命令:
# >>> help(Grid.configure)
# >>> help(Place.config)

# from tkinter import *
#
# Label(text="I'm in the first window!").pack()
# second = Toplevel()
# Label(second, text="I'm in the second window!").pack()
#
# # 调用函数mainloop以进入Tkinter主事件循环
# mainloop()
#
# for i in range(2):
#     Button(text=i).pack()

# 12.1.3 事件处理
# 你知道,可通过设置属性command给按钮指定动作(action)。这是一种特殊的事件处理,但
# Tkinter还提供了更通用的事件处理机制:方法bind。要让控件对特定的事件进行处理,可对其调
# 用方法bind,并指定事件的名称和要使用的函数。下面是一个示例:
# >>> from tkinter import *
# >>> top = Tk()
# >>> def callback(event):
# ... print(event.x, event.y)
# ...
# >>> top.bind('<Button-1>', callback)
# '4322424456callback'
# 其中<Button-1>是使用鼠标左按钮(按钮1)单击的事件名称。我们将这种事件关联到函数
# callback。这样,每当用户在窗口top中单击时,都将调用这个函数。向函数callback传递一个event
# 对象,这个对象包含的属性随事件类型而异。例如,对于鼠标单击事件,它提供了x和y坐标,在
# 这个示例中将它们打印出来了。还有很多其他类型的事件,完整的清单可使用下面的命令来获取:
# >>> help(Tk.bind)
# 要获悉更详细的信息,可参阅前面提到的资源。

# 12.1.4 最终的程序
# 至此,我们大致具备了编写前述程序所需的知识,但还需获悉用于创建小型文本框和大型文
# 本区域的控件的名称。通过快速浏览文档可知,要创建单行文本框,可使用控件Entry。要创建
# 可滚动的多行文本区域,可结合使用控件Text和Scrollbar,但模块tkinter.scrolledtext已经提
# 供了一种实现。要提取Entry控件的内容,可使用其方法get。对于ScrolledText对象,我们将使
# 用其方法delete和insert来删除文本。调用方法delete和insert时,需要使用合适的参数来指定
# 文本的位置;在这里,我们将使用'1.0'来指定第1行的第0个字符(即第一个字符前面),使用END
# 来指定文本末尾,并使用INSERT来指定当前插入点。最终的程序如代码清单12-1和图12-2所示。


# 代码清单12-1 简单的GUI文本编辑器
from tkinter import *
from tkinter.scrolledtext import ScrolledText

def load():
    with open(filename.get()) as file:
        contents.delete('1.0', END)
        contents.insert(INSERT, file.read())

def save():
    with open(filename.get(), 'w') as file:
        file.write(contents.get('1.0', END))

top = Tk()
top.title("Simple Editor")
contents = ScrolledText()

# 要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True;
# 所幸可调整控件的位置和拉伸方式。要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM
# 要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。
contents.pack(side=BOTTOM, expand=True, fill=BOTH)
filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)
Button(text='Open', command=load).pack(side=LEFT)
Button(text='Save', command=save).pack(side=LEFT)
# 调用函数mainloop以进入Tkinter主事件循环
mainloop()


# 你可按如下步骤来尝试使用这个文本编辑器。
# (1) 运行这个程序,你将看到一个类似于图12-2的窗口。
# (2) 在大型文本区域中输入一些内容,如Hello, world!。
# (3) 在小型文本框中输入一个文件名,如hello.txt。请确保指定的文件不存在,否则原有文件
# 将被覆盖掉。
# (4) 单击Save按钮。
# (5) 退出程序。
# (6) 再次启动程序。
# (7) 在小型文本框中输入刚才输入的文件名。
# (8) 单击Open按钮,这个文件包含的文本将出现在大型文本区域中。
# (9) 随心所欲地编辑这个文件,再保存它。

# 12.2 使用其他 GUI 工具包
# 大部分GUI工具包的基本要素都大致相同,但遗憾的是,当你学习使用新包时,必须花时间
# 了解让你能够实现目标的细节。因此,你应花时间来决定使用哪个包(如参阅标准库参考手册中
# 介绍其他GUI包的部分),再深入研究其文档并着手开始编写代码。但愿本章介绍的基本概念让
# 你能够理解这些文档。

# 12.3 小结
# 同样,下面来复习一下本章介绍的内容。
#  图形用户界面(GUI):GUI有助于让应用程序对用户更友好。并非所有的程序都需要GUI,
# 但只要程序需要与用户交互,GUI就可能很有帮助。
#  Tkinter:Tkinter是一个跨平台的Python GUI工具包,成熟而且使用广泛。
# 布局:通过指定组件的几何属性,很容易对其进行定位,但要确保它们在父窗口的大小
# 发生变化时做出正确的反应,就必须使用布局管理器。
#  事件处理:GUI工具包中用户触发事件执行的操作。要发挥作用,程序可能需要响应某些
# 事件,否则用户将无法与之交互。在Tkinter中,要给组件添加事件处理程序,可使用方
# 法bind。

在这里插入图片描述

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

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

相关文章

Java集合面试

文章目录 Java集合框架说说有哪些常见的集合&#xff1f;ArrayList和LinkedList的区别&#xff1f;HashMap的数据结构&#xff1f;把你了解的所有都讲一讲&#xff1f;数据结构&#xff1a; put流程Hashmap的resize方法的执行过程&#xff1f;get流程JDK8 HashMap为什么引入红黑…

数据库事务概述

1.1 存储引擎支持情况 SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务。 能看出在 MySQL 中&#xff0c;只有 InnoDB 是支持事务的。 1.2 基本概念 事务&#xff1a; 一组逻辑操作单元&#xff0c;使数据从一种状态…

4.5V 至 23V、TAS2781RYYR音频放大器、QPF4617TR13 Wi-Fi® 6E非线性前端模块和DRV2667RGPR全集成压电式触觉驱动器

一、TAS2781RYYR&#xff0c;具有集成式音频处理和扬声器保护的 25W、4.5V 至 23V 数字输入 D 类放大器 介绍&#xff1a;TAS2781 是一款单声道、数字输入 D 类音频放大器&#xff0c;专为将高峰值功率高效率驱动到扬声器进行了优化。D类放大器在 18V 电源电压下可向 4Ω 负载…

SpringMVC_异常统一处理

3.全局统一异常处理 3.1目前存在问题 模拟后台出现服务器异常 GetMappingpublic ResultResp list(RequestParam(required false) String name){System.out.println(1/0);List<Item> ret service.lists(name);return ResultResp.success(retnull?Code.PAGE_FAIL:Code.…

JVM快速入门篇

一、JVM探究 1.1前言 请你谈谈你对jvm的理解&#xff1f;Java8虚拟机和之前的变化更新&#xff1f;什么是OOM&#xff1f;什么是栈溢出StackOverFlowError&#xff1f;怎么分析&#xff1f;jvm的常见调优参数有哪些&#xff1f;内存快照如何抓取&#xff1f;怎么分析Dump文件&…

RichView Text Box Items 文本框

RichView Text Box Items 文本框 RichView的文本框&#xff08;Text Box&#xff09;&#xff0c;是TRichView文档中的ITEM之一。 通常文本框项目&#xff08;Text Box Item&#xff09;是旁注的简化版本&#xff0c;该项目插入的位置没有可见的文本。 如果rvoShowSpecialChara…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

中频炉冷循环监测终端,智能化管理冷却系统的新利器!

在现代工业生产中&#xff0c;中频炉是一种广泛应用于金属加工和熔化的设备。 一、中频炉的降温剂 中频炉的使用中&#xff0c;企业往往关注的是中频炉晶闸管、电抗器、电容器、汇流排以及中频炉线圈&#xff0c;忽观中频炉的冷却水。中频炉的冷却水在中频炉、中频加热炉使用…

ICC2:partial blockage array脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 用法是先在玩加partial blockage array的地方create一个blockage,然后选中source这个脚本。需要定义三个值,分别是blockage的百分比,还有每个组成阵列的每个blockage宽和高。 addHBlkForSpecAre…

【以太网硬件二十一】USXGMII是什么?-Part2

&#x1f449;个人主页&#xff1a; highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 目录 PCS功能细节 XGMII到USXGMII的映射 带内配置和状态信号 自协商相关 电气特…

如何修复老照片?老照片修复翻新的方法

老旧照片&#xff0c;尤其是黑白照片&#xff0c;往往因为年代久远、保存方式不当等原因而出现褪色、污损、划痕等问题&#xff0c;会比较难以修复&#xff0c;就算是技术精湛的专业修复师&#xff0c;也是需要投入极大时间精力的&#xff0c;效果也是不可预料的。 修复老照片…

YOLOv5添加注意力机制

添加SE注意力机制 第一步 添加代码-SE类-models/common.py第二步 添加注意力关键词-models/yolo.py第三步 创建配置文件-models/yolov5s_SE.yaml第四步 修改读取配置-train.py 第一步 添加代码-SE类-models/common.py 进入models/common.py文件&#xff0c;这个文件里面包含了…

直线导轨的替换方法

目前&#xff0c;直线导轨的使用率持续上升&#xff0c;已广泛应用在各种各样的行业中&#xff0c;可替换性高是其广泛使用的重要原因之一&#xff01;直线导轨的替换指的就是导轨和滑块可以单出&#xff0c;不用整套替换。 市面上使用率最高的直线导轨品牌应该就是台湾*银了&a…

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

Effective Java(中文版第3版)第2条:遇到多个构造器参数时要考虑使用构建器

Effective Java&#xff08;中文版第3版&#xff09;第2条&#xff1a;遇到多个构造器参数时要考虑使用构建器

Unity(三) Shader着色器初探

学习3D开发技术的时候无可避免的要接触到Shader&#xff0c;那么Shader是个什么概念呢&#xff1f;其实对于开发同事来说还是比较难理解的&#xff0c;一般来说Shader是服务于图形渲染的一类技术&#xff0c;开发人员可以通过其shader语言来自定义显卡渲染页面的算法&#xff0…

MyBatis-快速入门

MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 MyBatis是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了Google code&#xff0c;并且改名为MyBatis,2013年11月迁移到Github 使用MyBatis查询所有用户信息&#xff1a; 1.准备工作&a…

项目管理工具:实现项目科学管理的利器

什么是项目管理工具 项目管理工具是指用于协助规划、组织、执行和监控项目活动的软件或应用程序。它们提供了一系列功能和工具&#xff0c;帮助项目管理人员和团队有效地管理项目进度、资源分配、任务协作以及沟通等方面的工作。项目管理工具的目标是提高团队的工作效率、优化…

Git 基本原理和常用操作

Git Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。 Git 常用操作 git 提交流程&#xff1a;工作区 -> git add 到暂存区 -> gi…

RunnerGo——更高效、更易用的性能测试利器

随着互联网技术的迅速发展&#xff0c;性能测试已成为保障应用程序顺畅运行的关键环节。在众多性能测试工具中&#xff0c;RunnerGo以其独特的优势&#xff0c;逐渐成为了开发者和测试人员的首选。本文将详细介绍RunnerGo的特点&#xff0c;并对比其与JMeter的优势&#xff0c;…