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

发布时间:2024年01月12日

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

下一篇:

作者发炎

衔接上一篇文章,本文章完成了"页面设置"子窗口的部分功能,并且点击"确定"按钮后会把当前设置的参数保存到文件里。但是,右侧的图片预览未实现,我的理解是:每设置一处打印纸张的参数,相应的预览会同步更新图片,那么就要很多的图片提供显示,所以现阶段就把这个功能忽略了。

打印纸张的来源也没有完成,我的理解是:打印机放置打印纸张的地方,现阶段没能力实现。

如果大家复制示例代码去运行时,就会发现有两个窗口,这不是BUG,也不用隐藏主窗口,在下一篇文章里会得到验证。

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

设计步骤

在"记事本项目" --> "code"目录下新建了一个"记事本_页面设置功能设计_1.py"文件,开始本阶段的项目设计开发,如下图:

运行结果

导入【记事本项目.code.记事本_页面设置】
预览图片纸张大小:A4
预览图片纸张方向:纵向
预览图片页边距:(20, 20, 25, 25)
预览图片页眉/页脚:('', '')
    ...
    ...
    ...
预览图片纸张大小:A5
预览图片纸张方向:横向
预览图片页边距:(100, 100, 200, 200)
预览图片页眉/页脚:('300', '300')
(1, 'A4', 20, 20, 25, 25, '', '')
确定
(2, 'A5', 100, 100, 200, 200, '300', '300')

?

?此时会发现"记事本项目" --> "data"目录下新建了一个"page_setup.txt",文件内容如下:

A5(*)2(*)100(*)100(*)200(*)200(*)300(*)300(*)

代码示例:记事本_页面设置功能设计_1.py

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

未完成:
    1.右侧实时图片预览未完成
    2.来源(S)功能未完成

"""

# 通配符 "*"
__all__ = ['PageSetup_1']

# 导入内置模块
import webbrowser, os
import tkinter.messagebox as tkmb

# 导入"记事本功能设计_1"模块
from 记事本项目.code.记事本_页面设置 import *


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

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

        # 还原上次"页面设置"的参数
        self.updateData()

        # 右侧预览还原上次"页面设置"的参数图片
        self.pagesetupData()

        # 当在纸张大小下拉菜单选择纸张时,在右侧预览应该同步显示(未完成)
        # self.paperMenu.configure(command=self.paperOption)
        # 由于self.paperMenu对象的configure()方法没有command属性(求解决方法)
        # 所以才使用self.paperVar对象的trace(),但也导致了会调用两次(求解)
        self.paperVar.trace('w', lambda a, b, c: self.pagesetupData())

        # (打印纸张)纵向,右侧预览同步更新(未完成)
        self.lengthways.configure(command=self.pagesetupData)
        # (打印纸张)横向,右侧预览同步更新(未完成)
        self.crosswise.configure(command=self.pagesetupData)

        # 捆绑获取输入框的数据事件,右侧预览同步更新(未完成)
        self.bind('<KeyRelease>', self.pagesetupData)

        # 捆绑跳转网页事件
        self.headerFooterWeb.bind('<Button-1>', lambda event: webbrowser.open(
            'https://support.microsoft.com/zh-cn/windows/更改记事本中的页眉和页脚命令-c1b0e27b-497d-c478-c4c1-0da491cac148'))

        # 确定当前页面所有参数设置
        self.confirm.config(command=lambda: self.confirmCancel('确定'))
        # 取消放弃当前设置,并返回
        self.cancel.configure(command=lambda: self.confirmCancel('取消'))


    # "页面设置"窗口确定与取消
    def confirmCancel(self, option, event=None):
        global PAPER_VAR, PAPER_ORIENT
        global LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VAR
        global HEADER_VAR, FOOTER_VAR

        print(f'{PAPER_ORIENT, PAPER_VAR,LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VAR,HEADER_VAR, FOOTER_VAR}')
        print(option)

        if option == '确定':
            # 修改的数值保存到全局变量
            PAPER_VAR = self.paperVar.get()         # (打印纸张)尺寸大小
            PAPER_ORIENT = self.orientVar.get()     # (打印纸张)方向
            # (打印纸张)设置页边距(毫米)
            LEFT_VAR = self.leftVar.get()           # (打印纸张)左页边距
            RIGHT_VAR = self.rightVar.get()         # (打印纸张)右页边距
            TOP_VAR = self.topVar.get()             # (打印纸张)上页边距
            BOTTOM_VAR = self.bottomVar.get()       # (打印纸张)下页边距
            # (打印纸张)设置页眉页脚
            HEADER_VAR = self.headerVar.get()       # (打印纸张)页眉
            FOOTER_VAR = self.footerVar.get()       # (打印纸张)页脚

            # "页面设置"数据参数保存到文件
            data_list = [PAPER_VAR, PAPER_ORIENT, LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VAR, HEADER_VAR, FOOTER_VAR]
            with open('.\\..\\data\\page_setup.txt', 'w', encoding='utf-8') as file:
                # 写入数据
                for i in data_list:
                    file.write(f'{i}(*)')
                file.write('\n')

            print(f'{PAPER_ORIENT, PAPER_VAR, LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VAR, HEADER_VAR, FOOTER_VAR}')

        elif option == '取消':
            # 判断是否有修改"页面设置"参数
            if PAPER_VAR != self.paperVar.get() or PAPER_ORIENT != self.orientVar.get() or LEFT_VAR != self.leftVar.get() \
                    or RIGHT_VAR != self.rightVar.get() or TOP_VAR != self.topVar.get() or BOTTOM_VAR != self.bottomVar.get()\
                    or HEADER_VAR != self.headerVar.get() or FOOTER_VAR != self.footerVar.get():

                self.bell()     # 发出警告声音
                if not tkmb.askokcancel('取消', f'当前"页面设置"的参数有所改动 !\n\n是否坚持放弃修改并退出 ?\n{" "*60}', parent=self):
                    return

        # 关闭当前窗口
        self.destroy()


    # 还原上次"页面设置"参数
    def updateData(self, event=None):
        global PAPER_VAR, PAPER_ORIENT
        global LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VAR
        global HEADER_VAR, FOOTER_VAR

        # 若是文件存在
        if os.path.exists('.\\..\\data\\page_setup.txt'):
            # 打开文件
            with open('.\\..\\data\\page_setup.txt', encoding='utf-8') as file:
                # 读取文件数据
                for row in file:
                    # 更新"页面设置"参数的数据
                    self.paperVar.set(row.split('(*)')[0])          # (打印纸张)尺寸大小
                    self.orientVar.set(int(row.split('(*)')[1]))    # (打印纸张)方向
                    self.leftVar.set(int(row.split('(*)')[2]))      # (打印纸张)左页边距
                    self.rightVar.set(int(row.split('(*)')[3]))     # (打印纸张)右页边距
                    self.topVar.set(int(row.split('(*)')[4]))       # (打印纸张)上页边距
                    self.bottomVar.set(int(row.split('(*)')[5]))    # (打印纸张)下页边距
                    self.headerVar.set(row.split('(*)')[6])         # (打印纸张)页眉
                    self.footerVar.set(row.split('(*)')[7])         # (打印纸张)页脚
                    # 更新"页面设置"参数的全局变量
                    # (打印纸张)尺寸大小
                    PAPER_VAR = self.paperVar.get()      # (打印纸张)尺寸大小
                    PAPER_ORIENT = self.orientVar.get()  # (打印纸张)方向
                    # (打印纸张)设置页边距(毫米)
                    LEFT_VAR = self.leftVar.get()        # (打印纸张)左页边距
                    RIGHT_VAR = self.rightVar.get()      # (打印纸张)右页边距
                    TOP_VAR = self.topVar.get()          # (打印纸张)上页边距
                    BOTTOM_VAR = self.bottomVar.get()    # (打印纸张)下页边距
                    # (打印纸张)设置页眉页脚
                    HEADER_VAR = self.headerVar.get()    # (打印纸张)页眉
                    FOOTER_VAR = self.footerVar.get()    # (打印纸张)页脚


    # 右侧预览更新"页面设置"的参数图片(未完成)
    def pagesetupData(self, event=None):
        """ 实时更新右侧预览图片 """
        # 修改右侧预览的(打印)纸张大小图片
        if self.paperVar.get() == f'A3{" " * 55}':
            print('预览图片纸张大小:A3')
            # 更新右侧预览图片
        else:
            print(f'预览图片纸张大小:{self.paperVar.get()}')
            # 更新右侧预览图片

        # (打印纸张)方向选择
        if self.orientVar.get() == 1:
            print('预览图片纸张方向:纵向')
            # 更新右侧预览图片
        elif self.orientVar.get() == 2:
            print('预览图片纸张方向:横向')
            # 更新右侧预览图片

        # (打印纸张)设置页边距(毫米)
        print(f'预览图片页边距:{self.leftVar.get(), self.rightVar.get(), self.topVar.get(), self.bottomVar.get()}')
        # 更新右侧预览图片

        # (打印纸张)设置页眉页脚
        print(f'预览图片页眉/页脚:{self.headerVar.get(), self.footerVar.get()}')
        # 更新右侧预览图片


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

作者:周华

创作日期:2024/1/12

文章来源:https://blog.csdn.net/zhouhua2022/article/details/135558311
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。