Reputation: 45
I am new to python and I am learning from different resources I am trying to use PYQT5 print support but I am getting error, I try my best to solve this problem from google but i found no solution so I am asking this question here please below is my code
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_())
and i am getting this error
File "print.py", line 74, in print
self.frame().print_(dialog.printer())
TypeError: 'QFrame' object is not callable
please tell me the solution as I am new in python Thanks in advance
Upvotes: 2
Views: 9175
Reputation: 243897
Your code has several problems:
()
, a class if it is.print_
method, only QTextEdit and some classes have it, in the general case you should use QPainter.Considering the above, the solution is as follows:
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_())
Upvotes: 2