如何用Tkinter的asksaveasfilename修改ReportLab的doc.build输出目录?
解决方法
问题出在你创建SimpleDocTemplate时用的是固定文件名,没有用到通过asksaveasfilename获取的自定义路径。你需要调整代码顺序,先获取保存路径,再用这个路径初始化文档对象,具体修改如下:
def save_as_pdf(self, file_path=None): pdfmetrics.registerFont(TTFont('DejaVuSerif', 'DejaVuSerif.ttf')) # 先处理保存路径的获取 if file_path is None: file_path = asksaveasfilename( filetypes=( ("PDF-файл", "*.pdf"), ("All files", "*.*"), ), initialfile=f"{self.current_friend}_computers.pdf", ) # 处理用户取消选择的情况 if not file_path: return # 用获取到的完整路径初始化SimpleDocTemplate doc = SimpleDocTemplate(file_path, pagesize=letter) story = [] data = [self.table_computers.item(row_id)['values'] for row_id in self.table_computers.get_children()] tblstyle = TableStyle([('FONT', (0, 0), (-1, len(data)-1), 'DejaVuSerif', 12)]) tbl = Table(data) tbl.setStyle(tblstyle) story.append(tbl) doc.build(story)
关键修改点
- 调整顺序:先调用
asksaveasfilename拿到用户选择的完整路径,再创建SimpleDocTemplate对象 - 增加判断:如果用户取消选择(
file_path为空),直接返回,避免执行后续代码报错 - 替换路径:把
SimpleDocTemplate的第一个参数从固定文件名改成用户选择的file_path
这样修改后,doc.build(story)就会把PDF保存到你选择的目录里了。
内容的提问来源于stack exchange,提问作者Ivan Zaycev
相关产品推荐
相关产品推荐

