使用Pyqt打印支持,但得到错误“Object is not callable”

2024-06-28 19:23:24 发布

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

我是python的新手,我从不同的资源中学习 我试图使用PYQT5打印支持,但我得到了错误,我尽我所能从谷歌解决这个问题,但我没有找到解决办法,所以我问这个问题在这里请 下面是我的代码

from PyQt5 import QtCore, QtGui, QtWidgets ,QtPrintSupport

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(615, 356)
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setGeometry(QtCore.QRect(10, 10, 571, 301))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.textEdit = QtWidgets.QTextEdit(self.frame)
        self.textEdit.setGeometry(QtCore.QRect(100, 10, 331, 71))
        self.textEdit.setObjectName("textEdit")
        self.tableWidget = QtWidgets.QTableWidget(self.frame)
        self.tableWidget.setGeometry(QtCore.QRect(30, 90, 521, 121))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setRowCount(3)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setGeometry(QtCore.QRect(240, 250, 91, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.print)
        item.setText(_translate("Form", "New Column"))
        self.pushButton.setText(_translate("Form", "Print"))

    def print (self):
        dialog = QtPrintSupport.QPrintDialog()
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            self.frame().print_(dialog.printer())


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

我得到了这个错误

^{pr2}$

请告诉我解决方案,因为我是python新手 提前谢谢


Tags: selfformitemframeqtcoreqtwidgetspushbuttonsetobjectname
1条回答
网友
1楼 · 发布于 2024-06-28 19:23:24

您的代码有几个问题:

  • 对象不可调用,因此不应使用(),如果它是类的话。在
  • QFrame没有print_方法,只有QTextEdit和一些类有它,一般情况下应该使用qpaint。在
  • 提供Qt-Designer的类不是widget,所以我建议您不要修改它或在那里实现逻辑,因为您会有几个问题,最好根据模板创建一个继承适当widget的类,并使用Qt Designer的类来填充它

综合以上考虑,解决方案如下:

from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(615, 356)
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setGeometry(QtCore.QRect(10, 10, 571, 301))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.textEdit = QtWidgets.QTextEdit(self.frame)
        self.textEdit.setGeometry(QtCore.QRect(100, 10, 331, 71))
        self.textEdit.setObjectName("textEdit")
        self.tableWidget = QtWidgets.QTableWidget(self.frame)
        self.tableWidget.setGeometry(QtCore.QRect(30, 90, 521, 121))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setRowCount(3)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        self.pushButton = QtWidgets.QPushButton(self.frame)
        self.pushButton.setGeometry(QtCore.QRect(240, 250, 91, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setText("Print")

class Widget(QtWidgets.QWidget, Ui_Form):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.print)

    def print(self):
        printer = QtPrintSupport.QPrinter()
        printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
        printer.setPageMargins(12, 16, 12, 20, QtPrintSupport.QPrinter.Millimeter)
        printer.setFullPage(False)
        dialog = QtPrintSupport.QPrintDialog(printer, self)
        if dialog.exec_() == QtWidgets.QDialog.Accepted:
            painter = QtGui.QPainter(dialog.printer())
            xscale = printer.pageRect().width() /float(w.width())
            yscale = printer.pageRect().height() /float(w.height())
            scale = min(xscale, yscale)
            painter.translate(printer.paperRect().center())
            painter.scale(scale, scale)
            painter.translate(-w.width()/ 2, -w.height()/ 2)
            self.frame.render(painter)
            painter.end()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >