上一篇:【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.右侧实时图片预览未完成
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