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

news2024/11/16 12:52:33

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

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

作者发炎

本文章与"记事本项目"的第一篇文章类似。这里是重新创建新的"页面设置"子窗口,进行开发设计。

那为什么与上一篇文章没有衔接呢?是因为这个"页面设置"是一个独立的子窗口,并且受主窗口调度。如果代码模块混为设计开发,就会降低可读性,并且不利于代码模块维护与迭代升级。

有疑问或建议,欢迎在评论区戳我哟!

设计步骤

在"记事本项目" --> "code"目录下新建项目代码模块文件"记事本_页面设置.py"设计开发,如下图:

运行结果

代码示例:记事本_页面设置.py

"""
    记事本(打印)页面设置
"""

# 通配符 "*"
__all__ = ['PageSetup_base']
__all__.extend(['PAPER_VAR', 'PAPER_ORIENT', 'LEFT_VAR', 'RIGHT_VAR', 'TOP_VAR', 'BOTTOM_VAR', 'HEADER_VAR', 'FOOTER_VAR'])


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


# 全局变量
# 永久保存变量
PAPER_VAR = 'A4'    # (打印纸张)尺寸大小
PAPER_ORIENT = 1    # (打印纸张)方向
LEFT_VAR = 20       # (打印纸张)左页边距
RIGHT_VAR = 20      # (打印纸张)右页边距
TOP_VAR = 25        # (打印纸张)上页边距
BOTTOM_VAR = 25     # (打印纸张)下页边距
HEADER_VAR = ''     # (打印纸张)页眉
FOOTER_VAR = ''     # (打印纸张)页脚


class PageSetup_base(tk.Toplevel):
    """ 继承tk.Toplevel, 设计记事本(打印)页面设置 """
    def __init__(self):
        """ 重写父类的构造方法 """
        # 调用父类的构造方法
        super().__init__()

        """ 开始对记事本(打印)页面设置进行设计 """

        self.title('页面设置')  # 窗口标题
        self.geometry(f'622x418+{self.winfo_screenwidth() // 4 + 60}+{self.winfo_screenheight() // 8 + 52}')
        self.focus()          # 设置窗口焦点
        self.resizable(0, 0)  # 禁止窗口的放大
        self.grab_set()       # 锁定父窗口
        # 修改窗口标题的图片
        self.PageSetup_photo = tk.PhotoImage(file='.\\..\\photo\\记事本.png')
        self.iconphoto(True, self.PageSetup_photo)

        """ 窗口布局 """
        # (打印)纸张选择
        self.paperFrame = ttk.LabelFrame(self, text='纸张', padding=(191, 38))
        self.paperFrame.place(x=14, y=16)
        tk.Label(self.paperFrame).pack()
        # 大小
        self.size = tk.Label(self, text='大小(Z):')
        self.size.place(x=24, y=48)
        # 来源
        self.source = tk.Label(self, text='来源(S):', state='disable')
        self.source.place(x=24, y=92)

        """ 纸张大小下拉菜单 """
        # 修改 OptionMenu 的样式
        self.style = ttk.Style()
        self.style.configure("my.TMenubutton", background='#DCDCDC', width=35)
        # 纸张大小下拉菜单
        self.paperVar = tk.StringVar(value=PAPER_VAR)
        self.paperSelection = [self.paperVar.get(), f'A3{" " * 55}', 'A4', 'A5', 'B4 (JIS)', 'B5 (JIS)', 'Executive',
                               'Statement', 'Tabloid', '法律专用纸', '信纸']
        self.paperMenu = ttk.OptionMenu(self, self.paperVar, *self.paperSelection, style="my.TMenubutton")
        self.paperMenu.place(x=110, y=46)

        """ 纸张来源下拉菜单 """
        # 修改 OptionMenu 的样式
        self.style.configure("my2.TMenubutton", background='#C0C0C0', width=35)
        # 纸张大小下拉菜单
        self.sourceVar = tk.StringVar()
        self.sourceOption = [None, f'选项1{" " * 55}', '选项2', '选项3']
        self.sourceMenu = ttk.OptionMenu(self, self.sourceVar, *self.sourceOption, style="my2.TMenubutton")
        self.sourceMenu.config(state="disabled")
        self.sourceMenu.place(x=110, y=90)

        # (打印纸张)方向选择
        self.orientFrame = ttk.LabelFrame(self, text='方向', padding=(50, 38))
        self.orientFrame.place(x=14, y=147)
        tk.Label(self.orientFrame).pack()
        self.orientVar = tk.IntVar(value=PAPER_ORIENT)
        # (打印纸张)纵向
        self.lengthways = ttk.Radiobutton(self, text='纵向(O)', variable=self.orientVar, value=1)
        self.lengthways.place(x=26, y=180)
        # (打印纸张)横向
        self.crosswise = ttk.Radiobutton(self, text='横向(A)', variable=self.orientVar, value=2)
        self.crosswise.place(x=26, y=220)

        # (打印纸张)页边距(毫米)
        self.marginFrame = ttk.LabelFrame(self, text='页边距(毫米)', padding=(130, 38))
        self.marginFrame.place(x=136, y=147)
        tk.Label(self.marginFrame).pack()
        # 文字标签
        tk.Label(self, text='左(L):').place(x=148, y=180)
        tk.Label(self, text='右(R):').place(x=274, y=180)
        tk.Label(self, text='上(T):').place(x=148, y=220)
        tk.Label(self, text='下(B):').place(x=274, y=220)
        # 输入框
        self.leftVar = tk.IntVar(value=LEFT_VAR)
        self.rightVar = tk.IntVar(value=RIGHT_VAR)
        self.topVar = tk.IntVar(value=TOP_VAR)
        self.bottomVar = tk.IntVar(value=BOTTOM_VAR)
        self.leftEntry = ttk.Entry(self, width=6, textvariable=self.leftVar)
        self.leftEntry.place(x=200, y=180)
        self.rightEntry = ttk.Entry(self, width=6, textvariable=self.rightVar)
        self.rightEntry.place(x=326, y=180)
        self.topEntry = ttk.Entry(self, width=6, textvariable=self.topVar)
        self.topEntry.place(x=200, y=220)
        self.bottomEntry = ttk.Entry(self, width=6, textvariable=self.bottomVar)
        self.bottomEntry.place(x=326, y=220)

        # (打印纸张)预览
        self.previewFrame = ttk.LabelFrame(self, text='预览', padding=(88, 147))
        self.previewFrame.place(x=420, y=16)
        tk.Label(self.previewFrame).pack()
        self.preview_photo = tk.PhotoImage(file='.\\..\\photo\\微信余额.png')
        tk.Label(self, image=self.preview_photo).place(x=421, y=37)
        # 页眉、页脚变量
        self.headerVar = tk.StringVar(value=HEADER_VAR)
        self.footerVar = tk.StringVar(value=FOOTER_VAR)
        # 页眉
        tk.Label(self, text='页眉(H):').place(x=14, y=288)
        self.headerEntry = ttk.Entry(self, width=42, textvariable=self.headerVar)
        self.headerEntry.place(x=106, y=288)
        # 页脚
        tk.Label(self, text='页脚(F):').place(x=14, y=330)
        self.footerEntry = ttk.Entry(self, width=42, textvariable=self.footerVar)
        self.footerEntry.place(x=106, y=330)

        # 页眉页脚输入值网页详情介绍
        # 修改 Button 的样式
        # self.style.configure("my.TButton", width=6, font=("Arial", 10, 'underline'), foreground="blue")
        # ttk.Button(self, text='输入值', style='my.TButton').place(x=106, y=360)
        self.headerFooterWeb = tk.Label(self, text='输入值', relief='flat', foreground="blue", font=("Arial", 10, 'underline'))
        self.headerFooterWeb.place(x=106, y=360)

        # 确定
        # 修改 Button 的样式
        self.style.map("my.TButton", background=[('!active', '!disabled', '#00BFFF')])
        self.confirm = ttk.Button(self, text='确定', width=13, style='my.TButton')
        self.confirm.place(x=394, y=372)
        # 取消
        self.cancel = ttk.Button(self, text='取消', width=13)
        self.cancel.place(x=506, y=372)


# 代码测试
if __name__ == '__main__':
    ui = PageSetup_base()    # 实例化页面设置
    ui.mainloop()            # 循环窗口运行
else:
    print(f'导入【{__name__}】')

作者:周华

创作日期:2024/1/11

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

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

相关文章

STM32串口485通信如何控制收发管脚

要有效的控制485的收发管脚,首先要知道485通信发送命令完成的时间,我们执行发送命令结束并不代表硬件已经把数据发出去了,可能1ms以后才真正完成,如果我们控制管脚不当,可能导致数据不能完全发出去。导致串口通信异常。…

日志采集传输框架之 Flume,将监听端口数据发送至Kafka

1、简介 Flume 是 Cloudera 提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传 输的系统。Flume 基于流式架构,主要有以下几个部分组成。 主要组件介绍: 1)、Flume Agent 是一个 JVM 进程&#xf…

数据结构队列实现(赋完整代码)

文章目录 1、定义及结构2、队列实现完整代码 1、定义及结构 1.一种特殊的线性表,只允许在一段进行插入,另一段进行删除; 2.进行插入操作的一端称为队尾,进行删除操作的一端称为队头; 3.队列具有先进先出的特性 FIFO…

Linux操作系统——重定向与缓冲区

1.理解一下struct file内核对象 上一篇文章(文件详解)我们一直在谈,一个文件要被访问就必须要先被打开,打开之前就必须要先把文件加载到内存,同时呢我们的操作系统为了管理文件也会为我们的文件创建相对应的struct fi…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

视频剪辑实例:探索画中画视频剪辑,创意无限可能,批量制作视频

随着社交媒体和视频平台的迅速发展,视频剪辑,作为视频创作的核心环节,对于呈现内容、传达情感和提升体验具有至关重要的作用。现在来看云炫AI智剪的视频剪辑实例,如何批量制作视频,提升工作效率。 画中画视频合并成功…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述: 一台国产电脑网线连接正常,打开网页后显示无法访问,那么是什么原因无法上网呢?下面就告诉你一个小方法去解决一下这个问题; 检查故障: 检测交换机、网线、水晶头全都正常,同房间摆放的…

荣耀开发者大会 2023·一张图读懂服务分发分论坛

荣耀智慧服务,高效连接开发者与用户,构建主动服务全新体验! 2023年荣耀智慧服务总数已突破25000,帮助众多开发者提升业务增长~ 今年将会开放更多生态场景,配合多元服务分发,从应用到场景,从用…

闪存的基础知识1-Vt的定义

系列文章目录 本次系列文章主要分享与存储相关的知识 文章目录 目录 系列文章目录 前言 一、mos管 阈值电压是什么? 二、详细分析 1.通俗理解 2.读入数据 总结 前言 阈值电压(Vt) 阈值电压(Vt或Vth)的概念是从MOS管来的。 一、mos管 阈值电压是什么? …

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

AI模型理解误区:微调垂直行业-VS-企业专属知识库或AI助理

概述 企业定制私有化大模型的区别&#xff0c;分为训练大模型和调用大模型两种方向&#xff0c;以及企业自己的智能客服的实现方法。 - 企业定制的私有化大模型与一般的大模型不同&#xff0c;需要高成本训练。- 企业可以选择调用已经训练好的大模型来应用。- 企业可以使用向量…

为什么建筑工程行业要十分重视主数据管理?

业务背景 主数据管理是数字化技术不可或缺的一部分。 建筑行业数字化转型中&#xff0c;跨部门协作是非常重要的。主数据管理能够提供一个统一的数据平台&#xff0c;方便各个部门数据共享和交流&#xff0c;也可以实现人力、物资、设备等各种资源的集中管理和优化配置。 此外…

[element-ui] 级联选择器el-cascader不触发change事件

el-cascader 使用官网的数据是可以的 官网数据中最后一级没有children // 删除最后一级的children changeKey(arr) {for (var i0; i<arr.length; i) {if (arr[i].children.length) {this.changeKey(arr[i].children)} else {delete arr[i].children}} ]就可以了 参考&…

浅谈专项测试之弱网络测试

一&#xff0e;弱网络测试背景 移动端产品的使用并非完全都是在流畅的wifi环境&#xff0c;大部分用户主要使用4G,3G,2G等网络&#xff0c;另外因为移动端产品使用的场景多变&#xff0c;如进公交&#xff0c;上地铁&#xff0c;坐电梯&#xff0c;使得弱网测试显得尤为重要。考…

基于springboot数码论坛系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把数码论坛与现在网络相结合&#xff0c;利用java技术建设数码论坛系统&#xff0c;实现数码论坛的信息化。则对于进一步提高数码论坛发展&#xff0c;丰富数码论坛经验能起到不少的促进作用。 数码论坛系统能够通过互联网得到广泛…

大语言模型系列-总述

大语言模型发展史 研究人员发现&#xff0c;扩展预训练模型&#xff08;Pre-training Language Model&#xff0c;PLM&#xff09;&#xff0c;例如扩展模型大小或数据大小&#xff0c;通常会提高下游任务的模型性能&#xff0c;模型大小从几十亿&#xff08;1 B 10亿&#x…

细说JavaScript对象(JavaScript对象详解)

在JavaScript中对象作为数据类型之一&#xff0c;它的数据结构区别于其余5中数据类型&#xff0c;从数据结构角度看对象就是数据值的几个&#xff0c;其书就结构就是若干组名值对&#xff0c;类似于其他语言中的哈希、散列 关联数组等&#xff0c;但对象在JavaScript中不仅仅扮…

【MySQL高级】——InnoDB数据存储结构

1. 数据库的存储结构&#xff1a;页 <1> 磁盘与内存交互的基本单位&#xff1a;页 <2> 页结构概述 <3> 页的大小 <4> 页的上层结构 2. 页的内部结构 <1> 页的分类 <2> 页的结构 <3> File Header&#xff08;文件头&#xff09; 1.…

AUTO SEG-LOSS SEARCHING METRIC SURROGATES FOR SEMANTIC SEGMENTATION

AUTO SEG-LOSS: 搜索度量替代语义分割 论文链接&#xff1a;https://arxiv.org/abs/2010.07930 项目链接&#xff1a;https://github.com/fundamentalvision/Auto-Seg-Loss ABSTRACT 设计合适的损失函数是训练深度网络的关键。特别是在语义分割领域&#xff0c;针对不同的场…

Nginx安装http2和ssl模块

Nginx安装http2和ssl模块 Nginx在执行默认安装命令的时候&#xff0c;并不会编译启用ngx_http_v2_module模块。故在修改Nginx配置文件启用http2.0协议的时候会报错。 一.检查Nginx安装了哪些模块 #进入Nginx的安装目录 cd /usr/local/nginx #执行命令查看安装了哪些模块 ./sbi…