【Python】使用tkinter设计开发Windows桌面程序记事本(2)

上一篇:【Python】使用tkinter设计开发Windows桌面程序记事本(1)-CSDN博客

下一篇:

作者发炎

此代码模块是继承上一篇文章的代码模块的基础上开始设计开发的。

如果不知道怎么新建"记事本项目"文件夹,请参考上一篇文章,在此我不在复述。

在本篇文章主要完成了改变编辑区字体大小、右侧上下滑块滑动、底侧左右滑块滑动、显示光标在编辑区的位置、以及底部状态栏显示数据更新。

设计步骤

在"记事本项目"文件夹的"code"目录下新建本文章要设计开发的代码模块文件"记事本功能设计_1.py",如下图:

运行结果

代码示例:记事本功能设计_1.py

"""
    记事本功能设计

不足:
    1.底部状态栏的字体缩放百分比不是±10%,因为默认10号字体太小了,所以我选择了12号字体大小
    2.底部状态栏不能识别编辑内容编码格式,所以一直是UTF-8

"""

# 通配符 "*"
__all__ = ['Notepad_1', 'FONT_SIZE']

# 导入内置模块
import tkinter as tk
from tkinter import font

# 导入"记事本底座"模块
from 记事本项目.code.记事本底座 import Notepad_base


# 全局变量
# 初始化
FONT_SIZE = 12      # 默认字体大小


class Notepad_1(Notepad_base):
    """ 继承Notepad_base, 设计记事本功能 """
    def __init__(self):
        """ 重写父类的构造方法 """
        # 调用父类的构造方法
        super().__init__()

        """ 开始对记事本功能进行设计 """

        # 设置文本域与右侧和底部滚动条关联
        self.text.config(wrap="word", xscrollcommand=self.bottomScrollbar.set, yscrollcommand=self.rightScrollbar.set)
        # 底侧滚动条与文本域关联
        self.bottomScrollbar.config(command=self.text.xview)
        # 右侧滚动条与文本域关联
        self.rightScrollbar.config(command=self.text.yview)
        # 隐藏底侧滚动条(让其默认勾选上自动换行)
        self.bottomScrollbar.pack_forget()

        # 设置文本域编辑字体样式,以及字体大小
        self.fontSize = tk.IntVar(value=FONT_SIZE)
        self.setFont = font.Font(family='Tahoma', size=self.fontSize.get())
        self.text.config(font=self.setFont)


        # 捆绑事件,获取Text文本的光标位置
        self.text.bind('<KeyPress>', self.cursorPosition)  # 键盘按下触发
        self.text.bind('<KeyRelease>', self.cursorPosition)  # 键盘释放触发
        self.text.bind('<ButtonPress>', self.cursorPosition)  # 鼠标按下触发
        self.text.bind('<ButtonRelease>', self.cursorPosition)  # 鼠标释放触发
        # 自定义注册事件
        # self.text.event_add('<<CursorEvent>>', *('<KeyPress>', '<KeyRelease>', '<ButtonPress>', '<ButtonRelease>'))
        # self.text.bind('<<CursorEvent>>', self.cursorPosition)

        # 文本域字体大小捆绑事件
        self.threeViewMenu.entryconfigure(0, command=lambda: self.FontSizeEvent('放大'))
        self.threeViewMenu.entryconfigure(1, command=lambda: self.FontSizeEvent('缩小'))
        self.threeViewMenu.entryconfigure(2, command=lambda: self.FontSizeEvent('默认缩放'))
        # 自定义注册缩放事件('<<ZoomEvent>>')
        self.event_add('<<ZoomEvent>>',*('<Control-MouseWheel>','<Control-Key-=>','<Control-Key-+>','<Control-minus>','<Control-Key-0>'))
        # 捆绑自定义注册缩放事件改变字体大小
        self.bind('<<ZoomEvent>>', self.FontSizeEvent)  # 鼠标上滚缩小,下滚放大


        # 文本域输入自动换行显隐捆绑事件
        self.formatMenu.entryconfigure(0, command=self.setWord_wrap)
        # 文本域底部状态栏显隐捆绑事件
        self.viewMenu.entryconfigure(1, command=self.setState)


    # 状态栏:更新字体大小百分比
    def FontSizeEvent(self, event):
        # 菜单调整字体大小
        if event == '放大':
            self.event_generate('<Control-Key-+>')  # 引起键盘触发事件
            return
        elif event == '缩小':
            self.event_generate('<Control-minus>')  # 引起键盘触发事件
            return
        elif event == '默认缩放':
            self.event_generate('<Control-Key-0>')  # 引起键盘触发事件
            return

        # 快捷键调整字体大小
        # 向下滚动
        if event.delta < 0 or event.keysym == 'minus':
            # 字体大小范围
            if self.fontSize.get() <= 1:
                return
            # 缩小字体
            self.fontSize.set(self.fontSize.get() - 1)
            print('向上滚动,字体大小:', self.fontSize.get())
        # 向上滚动
        else:
            # 字体大小范围
            if self.fontSize.get() >= FONT_SIZE * 5:
                return
            # 放大字体
            self.fontSize.set(self.fontSize.get() + 1)
            # 恢复默认缩放
            if event.keysym == '0':
                self.fontSize.set(FONT_SIZE)
            print('向下滚动,字体大小:', self.fontSize.get())

        # 改变字体大小
        self.setFont.config(size=self.fontSize.get())
        # 改变底部显示字体大小百分比
        self.fontSizeLabel.config(text='{:.0%}'.format(self.fontSize.get() / FONT_SIZE))


    # 状态栏:获取Text光标位置
    def cursorPosition(self, event):
        row, column = event.widget.index("insert").split(".")
        print("光标位置:行", row, "列", int(column) + 1)
        self.locationLabel.config(text=f'  第 {row} 行,第 {int(column) + 1} 列')


    # 勾选自动换行显示与否
    def setWord_wrap(self, event=None):
        # 设置自动换行
        if self.word_wrap.get():
            # 自动换行设置
            self.text.config(wrap='word')
            # 移除底部水平滑动条
            self.bottomScrollbar.pack_forget()
            # 底部框架没有组件显示时移除
            if not self.state.get():
                self.bottomFrame.pack_forget()
        # 设置取消自动换行
        else:
            # 先移除右侧滚动条,再显示
            self.rightScrollbar.pack_forget()
            # 先移除中间文本域,再显示
            self.text.pack_forget()
            # 显示底部框架
            self.bottomFrame.pack(side=tk.BOTTOM, fill='both')
            # 取消自动换行设置
            self.text.config(wrap='none')
            # 显示底部水平滑动条
            self.bottomScrollbar.pack(fill='both')
        # 再显示右侧滚动条
        self.rightScrollbar.pack(side=tk.RIGHT, fill='both')
        # 再中间文本域
        self.text.pack(expand=True, fill='both')


    # 勾选底部状态栏显示与否
    def setState(self, event=None):
        # 底部显示状态栏
        if self.state.get():
            # 先移除右侧滚动条,再显示
            self.rightScrollbar.pack_forget()
            # 先移除中间文本域,再显示
            self.text.pack_forget()
            # 显示底部框架
            self.bottomFrame.pack(side=tk.BOTTOM, fill='both')
            # 显示状态栏
            self.stateFrame.pack(side=tk.BOTTOM, fill='both')
        # 底部移除状态栏
        else:
            # 移除状态栏
            self.stateFrame.pack_forget()
            # 底部框架没有组件显示时移除
            if self.word_wrap.get():
                self.bottomFrame.pack_forget()
        # 再显示右侧滚动条
        self.rightScrollbar.pack(side=tk.RIGHT, fill='both')
        # 再中间文本域
        self.text.pack(expand=True, fill='both')


# 代码测试
if __name__ == '__main__':
    ui = Notepad_1()    # 实例化记事本UI
    ui.mainloop()       # 循环窗口运行
else:
    print(f'导入【{__name__}】')

作者:周华

创作日期:2024/1/10

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

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

相关文章

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

C2-4.2.2 决策树-纯度+信息熵+信息增益

C2-4.2.2 决策树-纯度信息熵信息增益 1、首先了解他的应用背景——决策树 其实说白了&#xff0c;就是一个二叉树 2、纯度 我们举一个买黄金的例子吧&#xff01;黄金有999 和 9999 。 他们是有区别的&#xff0c;代表着黄金的纯度&#xff08;相对杂质而言&#xff09;&…

JMS消息发送

目录 概述1.搭建 JMS 环境2.使用JmsTemplate 发送消息3.接收JMS 消息 概述 JMS是一个Java标准&#xff0c;定义了使用消息代理(message broker)的通用API,在2001年提出。长期以来&#xff0c;JMS一直是Java 中实现异步消息的首选方案。在JMS 出现之前每个消息代理都有其私有的…

MongoDB 启动提示错误code=killed, signal=ABRT

1.停止MongoDB sudo systemctl stop mongod 2.检查数据损坏 sudo mongod --repair --dbpath /var/lib/mongodb 3.赋权限 chown -R mongodb:mongodb /var/lib/mongodb chown mongodb:mongodb /tmp/mongodb-27017.sock 如果不赋权限&#xff0c;启动的时候则会提示 4.启动Mo…

python 工作目录 与 脚本所在目录不一致

工作目录&#xff1a;执行脚本的地方 我以为工作目录会是当前执行脚本的目录位置&#xff0c;但其实不是&#xff0c;例如&#xff1a; 图中红色文件为我执行的脚本文件&#xff0c;但是实际的工作目录是PYTHON LEARNING 可以用如下代码查询当前工作目录&#xff1a; import os…

2024年甘肃省职业院校技能大赛 “信息安全管理与评估”赛项样题卷①

2024年甘肃省职业院校技能大赛 高职学生组电子与信息大类信息安全管理与评估赛项样题 第一阶段&#xff1a;第二阶段&#xff1a;模块二 网络安全事件响应、数字取证调查、应用程序安全第二阶段 网络安全事件响应第一部分 网络安全事件响应第二部分 数字取证调查第三部分 应用程…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面&#xff08;GUI&#xff09;工具。它是由 Redis Labs 开发的&…

Linux驱动学习—输入子系统

1、什么是输入子系统&#xff1f; 输入子系统是Linux专门做的一套框架来处理输入事件的&#xff0c;像鼠标&#xff0c;键盘&#xff0c;触摸屏这些都是输入设备&#xff0c;但是这邪恶输入设备的类型又都不是一样的&#xff0c;所以为了统一这些输入设备驱动标准应运而生的。…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…

【前端】使用javascript开发一个在线RGB颜色转换

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《前端》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌…

领英Linkedin自动跳转中国站点的解决方案

linkedin放弃中国市场后&#xff0c;在国内打开linkedin.com&#xff0c;会自动跳转到 linkedin.cn&#xff0c;无法与国际友人在同一个平台上联系。 按照搜到的方法尝试解决&#xff0c;包括修改浏览器默认语言、清除浏览数据、使用软路由上的插件给 linkedin.com设置从国外线…

CentOS本地部署SQL Server数据库无公网ip环境实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

使用 CMake 和 Ninja 构建 C/C++ 项目的教程

使用 CMake 和 Ninja 构建 C/C 项目的教程 CMake 是一个跨平台的开源构建工具&#xff0c;它简化了项目的构建过程。而 Ninja 是一个快速、轻量级的构建系统&#xff0c;与 CMake 配合使用可以提高项目的构建效率。本教程将向你介绍如何使用 CMake 和 Ninja 来构建你的 C/C 项…

版本控制背景知识

版本控制背景知识 本文是关于 Git 系列文章的导读&#xff0c;我们先介绍一下版本控制的背景知识。 什么是版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。它将什么时候、什么人更改了文件的什么内容等信息如实记录下来…

代码随想录算法训练营第一天|数组理论基础、704二分查找、27移除元素

数组理论基础 一维数组 数组中的元素在内存空间中是连续的数组名与数组中第一个元素的地址相同&#xff08;一维数组&#xff09;数组的下标从0开始删除数组的元素其实是用后面的元素覆盖掉要删除的元素数组的长度不能改变 二维数组 二维数组是按照行存储的&#xff0c;也是…

Vue入门四(组件介绍与定义|组件之间的通信)

文章目录 一、组件介绍与定义介绍定义1&#xff09;全局组件2&#xff09;局部组件 二、组件之间的通信1&#xff09;父组件向子组件传递数据2&#xff09;子传父通信 一、组件介绍与定义 介绍 组件(Component)是Vue.js 最强大的功能之一&#xff0c;它是html、css、js等的一个…

STK 特定问题建模(五)频谱分析(第二部分)

文章目录 简介三、链路分析3.1 星地链路干扰分析3.2 频谱分析 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分开展&#xff1a; 1、GEO星地通信收发机…

稀疏矩阵的三元组表示----(算法详解)

目录 基本算法包括&#xff1a;&#xff08;解释都在代码里&#xff09; 1.创建 2.对三元组元素赋值 3.将三元组元素赋值给变量 4.输出三元组 5.转置&#xff08;附加的有兴趣可以看看&#xff09; 稀疏矩阵的概念&#xff1a;矩阵的非零元素相较零元素非常小时&#xff…

极少数据就能微调大模型,一文详解LoRA等方法的运作原理

原文&#xff1a;极少数据就能微调大模型&#xff0c;一文详解LoRA等方法的运作原理 最近和大模型一起爆火的&#xff0c;还有大模型的微调方法。 这类方法只用很少的数据&#xff0c;就能让大模型在原本表现没那么好的下游任务中“脱颖而出”&#xff0c;成为这个任务的专家…

大气精美网站APP官网HTML源码

源码介绍 大气精美网站APP官网源码&#xff0c;好看实用&#xff0c;记事本修改里面的内容即可&#xff0c;喜欢的朋友可以拿去研究 下载地址 蓝奏云&#xff1a;https://wfr.lanzout.com/itqxN1ko2ovi CSDN免积分下载&#xff1a;https://download.csdn.net/download/huayu…