You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:02:48