上一篇:【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_ORIENTglobal LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VARglobal HEADER_VAR, FOOTER_VARprint(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_ORIENTglobal LEFT_VAR, RIGHT_VAR, TOP_VAR, BOTTOM_VARglobal 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