[英]pyFPDF .add_page() function breaking when instantiating from classmethod
每當我嘗試在__init__()
或classmethod
中獲取任何用戶輸入時, add_page()
函數都會出錯。 當我沒有任何方法來獲取用戶輸入時,它工作正常,所以我認為它會以某種方式干擾。
AttributeError:“PDF”對象沒有屬性“狀態”。 您的意思是:“旋轉”嗎?
錯誤
Name: ttt
Traceback (most recent call last):
File "/workspaces/106404228/shirtificate/shirtificate.py", line 63, in <module>
pdf = PDF.get_name()
File "/workspaces/106404228/shirtificate/shirtificate.py", line 44, in get_name
return cls(name)
File "/workspaces/106404228/shirtificate/shirtificate.py", line 32, in __init__
self.add_page(self, format='a4')
File "/home/ubuntu/.local/lib/python3.10/site-packages/fpdf/fpdf.py", line 813, in add_page
if self.state == DocumentState.CLOSED:
AttributeError: 'PDF' object has no attribute 'state'. Did you mean: 'rotate'?
代碼
from fpdf import FPDF
class PDF(FPDF):
def __init__(self, name):
if not name:
raise ValueError("no name")
self.name = name
self.add_page(self, format='a4')
# header
def header(self):
self.image("shirtificate.png")
self.ln(20)
@classmethod
def get_name(cls):
name = input("Name: ")
return cls(name)
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if not name:
raise ValueError("no name")
self._name = name
pdf = PDF.get_name()
pdf.set_font("helvetica", "B", 16)
pdf.output("shirtificate.pdf")
這不是因為用戶輸入,而是因為您在FPDF
對象尚未正確實例化時調用.add_page
。 您可以用硬編碼name
替換用戶輸入,但您仍然會收到相同的錯誤。 classmethod 只是使問題更加明顯。
您可以從 Traceback 中看到發生的事情的順序:
File "/workspaces/106404228/shirtificate/shirtificate.py", line 44, in get_name
return cls(name)
File "/workspaces/106404228/shirtificate/shirtificate.py", line 32, in __init__
self.add_page(self, format='a4')
return cls(name)
代碼將實例化FDPF
對象,然后調用您的__init__
,然后調用.add_page
。 但是.add_page
是FDPF
類的實例方法。 它應該在對象被實例化后被調用。 在您的代碼中,由於未調用父FPDF
類的__init__
,因此您的對象將缺少.state
和FPDF
對象的所有其他屬性,這會導致錯誤:
“PDF”對象沒有屬性“狀態”
您可以檢查FPDF
類的__init__
方法以了解它的作用。 如果您正在創建自定義子類,通常將父類的__init__
稱為子類__init__
的一部分。 (請參閱為什么不自動調用超類__init__
方法? )。
解決方法是將您的代碼重新組織為如下所示:
from fpdf import FPDF
class PDF(FPDF):
def __init__(self, name):
if not name:
raise ValueError("no name")
# Call the parent FPDF init
super().__init__()
# Add your custom code after
self.name = name
...
@classmethod
def get_name(cls):
name = input("Name: ")
# Create the object
obj = cls(name)
# Call FPDF object instance methods
# after it is created to customize
obj.add_page(format="A4")
return obj
...
pdf = PDF.get_name()
pdf.set_font("helvetica", "B", 16)
pdf.output("shirtificate.pdf")
在這里,主要的變化是:
super().__init__()
調用父級的__init__
.add_page
另一個建議的更改是重命名該類方法,因為它不僅僅是“獲取名稱”。 它應該被稱為create_from_name
或create_with_prompted_name
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.