如何创建和打开集成tkinter和Reportlabs包的pdf?

2024-09-28 03:19:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在我们的研究项目中,我和我的小组成员使用名为“PDFCanvas”的Python文件中存储的Reportlabs包创建了一个pdf文件生成器代码。在另一个名为“AppTest”的Python文件中,包含带有按钮的tkinter GUI,我们复制粘贴了PDFCanvas文件代码,以尝试使用按钮初始化PDF的创建和查看,当然,在单独的文件中也可以使用该按钮。显然,当我们在“AppTest”中运行程序时,它会提示我们错误:AttributeError: 'str' object has no attribute 'tk'。我们可以寻求帮助,以使其运行吗

我的错误在于删除单独PDF创建者的第一个参考工作代码,但它是:

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import LETTER
from reportlab.lib.units import inch, cm
from reportlab.pdfgen.canvas import *
from reportlab.lib.colors import *
from reportlab.rl_config import defaultPageSize
from reportlab.pdfbase.pdfmetrics import stringWidth

page_height = defaultPageSize[1]
page_width = defaultPageSize[0]

import os
import sys
import subprocess
import sqlite3

canvas = Canvas("Report - Name [Date].pdf")
canvas.setFont("Helvetica-Bold", 14)
canvas.drawString(72, 795.68, "Veterinary Office")
canvas.save()
subprocess.Popen(['Report - Name [Date].pdf'], shell=True)

更新-以下是生成错误的代码示例:

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import LETTER
from reportlab.lib.units import inch, cm
from reportlab.pdfgen.canvas import *
from reportlab.lib.colors import *
from reportlab.rl_config import defaultPageSize
from reportlab.pdfbase.pdfmetrics import stringWidth

page_height = defaultPageSize[1]
page_width = defaultPageSize[0]

import os
import sys
import sqlite3
import subprocess
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont
from tkinter import *

run = tk.Tk()

def PDFPrint():
    canvas = Canvas("Report - Name [Date].pdf")
    canvas.setFont("Helvetica-Bold", 14)
    canvas.drawString(72, 795.68, "Vet Office")

    canvas.save()
    subprocess.Popen(['Report - Name [Date].pdf'], shell=True)

aButton = Button(run, text = 'Print', command = PDFPrint())

run.mainloop()

对于完整的错误堆栈:

Traceback (most recent call last):
  File "C:\Users\Desktop\AppTest.py", line 32, in <module>
    aButton = Button(run, text = 'Print', command = PDFPrint())
  File "C:\Users\Desktop\AppTest.py", line 25, in PDFPrint
    canvas = Canvas("Report - Name [Date].pdf")
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.752.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 2688, in __init__
    Widget.__init__(self, master, 'canvas', cnf, kw)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.752.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 2566, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.752.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 2535, in _setup
    self.tk = master.tk
AttributeError: 'str' object has no attribute 'tk'
[Finished in 1.3s]

我们已经通过pip预先安装了ReportLabs库。我希望我提供了足够的资料,以便能够解答我们这个问题。谢谢大家!


Tags: 文件nameinfromimportreportpdfinit
1条回答
网友
1楼 · 发布于 2024-09-28 03:19:37

我想出来了。导入时,您使用:

from reportlab.pdfgen.canvas import Canvas
...
from tkinter import *

但问题是tkinter还定义并覆盖从reportlab导入的Canvas。这就是为什么你应该避免import *。要解决这个问题,只需将其更改为import tkinter as tk,然后在使用tkinter小部件/变量的地方添加tk.tkinter.Canvas需要tkinter小部件作为第一个参数,而reportlab.pdfgen.canvas.Canvas需要字符串

同时将此:aButton = Button(run, text = 'Print', command = PDFPrint())更改为:

aButton = Button(run, text = 'Print', command = PDFPrint)

TL;DR您导入了Canvas两次,其中一个定义丢失(您想要使用的定义)

相关问题 更多 >

    热门问题