class UI(QApplication): def installKeyFilter(self): self._handler = EventHandler(self) UI.instance().installEventFilter(self._handler) #self.browser.focusProxy().installEventFilter(_handler) def __init__(self, argv): super(UI, self).__init__(argv) margin = 22 self.browser = QWebEngineView() url = 'http://*****:*****@QtCore.pyqtSlot(str, name='takeScreenShot') def captureWindowImage(self,filePath): if(self.captureFrames): #print("Got signal") windowSize = self.browser.size() #print(windowSize) pixmap = QPixmap(windowSize) self.browser.render(pixmap) #print("Rendered Browser Window") pixmap.save(filePath) jsonPath=filePath+".json" jsonStr= json.dumps(self._handler.keyStatus) #print(jsonStr) localtime = time.asctime(time.localtime(time.time())) print("Screenshot at ", localtime) with open(jsonPath, "w") as jsonFile: jsonFile.write(jsonStr)
class Window(QWidget): def __init__(self, *args, **kwargs): super(Window, self).__init__(*args, **kwargs) self.resize(600, 400) layout = QHBoxLayout(self) # 左侧 widgetLeft = QWidget(self) layoutLeft = QVBoxLayout(widgetLeft) # 右侧 self.widgetRight = QListWidget(self, minimumWidth=200, iconSize=QSize(150, 150)) self.widgetRight.setViewMode(QListWidget.IconMode) layout.addWidget(widgetLeft) layout.addWidget(self.widgetRight) self.webView = QWebEngineView() layoutLeft.addWidget(self.webView) # 截图方式一 groupBox1 = QGroupBox('截图方式一', self) layout1 = QVBoxLayout(groupBox1) layout1.addWidget(QPushButton('截图1', self, clicked=self.onScreenShot1)) layoutLeft.addWidget(groupBox1) # 截图方式二(采用js) groupBox2 = QGroupBox('截图方式二', self) layout2 = QVBoxLayout(groupBox2) self.codeEdit = QLineEdit( 'body', groupBox2, placeholderText='请输入需要截图的元素、ID或者class:如body、#id .class') layout2.addWidget(self.codeEdit) self.btnMethod2 = QPushButton('', self, clicked=self.onScreenShot2, enabled=False) layout2.addWidget(self.btnMethod2) layoutLeft.addWidget(groupBox2) # 提供访问接口 self.channel = QWebChannel(self) # 把自身对象传递进去 self.channel.registerObject('_self', self) # 设置交互接口 self.webView.page().setWebChannel(self.channel) # 支持截图 settings = QWebEngineSettings.globalSettings() settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True) self.webView.loadStarted.connect(self.onLoadStarted) self.webView.loadFinished.connect(self.onLoadFinished) self.webView.load(QUrl("https://pyqt.site")) def onLoadStarted(self): print('load started') self.btnMethod2.setEnabled(False) self.btnMethod2.setText('暂时无法使用(等待页面加载完成)') @pyqtSlot(bool) def onLoadFinished(self, finished): if not finished: return print('load finished') # 注入脚本 page = self.webView.page() # 执行qwebchannel,jquery,promise,html2canvas page.runJavaScript(open('Data/qwebchannel.js', 'rb').read().decode()) page.runJavaScript(open('Data/jquery.js', 'rb').read().decode()) # page.runJavaScript( # open('Data/promise-7.0.4.min.js', 'rb').read().decode()) page.runJavaScript( open('Data/html2canvas.min.js', 'rb').read().decode()) page.runJavaScript(CreateBridge) print('inject js ok') self.btnMethod2.setText('截图2') self.btnMethod2.setEnabled(True) def onScreenShot1(self): # 截图方式1 page = self.webView.page() oldSize = self.webView.size() self.webView.resize(page.contentsSize().toSize()) def doScreenShot(): rect = self.webView.contentsRect() size = rect.size() image = QImage(size, QImage.Format_ARGB32_Premultiplied) image.fill(Qt.transparent) painter = QPainter() painter.begin(image) painter.setRenderHint(QPainter.Antialiasing, True) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.SmoothPixmapTransform, True) self.webView.render(painter) painter.end() self.webView.resize(oldSize) # 添加到左侧list中 item = QListWidgetItem(self.widgetRight) image = QPixmap.fromImage(image) item.setIcon(QIcon(image)) item.setData(Qt.UserRole + 1, image) # 先等一下再截图吧 QTimer.singleShot(2000, doScreenShot) def onScreenShot2(self): # 截图方式2 code = self.codeEdit.text().strip() if not code: return self.progressdialog = QProgressDialog(self, windowTitle='正在截图中') self.progressdialog.setRange(0, 0) self.webView.page().runJavaScript(CODE % code) self.progressdialog.exec_() @pyqtSlot(str) def saveImage(self, image): self.progressdialog.close() # data:image/png;base64,iVBORw0KG.... if not image.startswith('data:image'): return data = base64.b64decode(image.split(';base64,')[1]) image = QPixmap() image.loadFromData(data) # 添加到左侧list中 item = QListWidgetItem(self.widgetRight) item.setIcon(QIcon(image)) item.setData(Qt.UserRole + 1, image)
class TopActor(object): def setupUi(self, dialog): dialog.setObjectName("dialog") dialog.resize(755, 793) self.closeWinBtn = QtWidgets.QPushButton(dialog) self.closeWinBtn.setGeometry(QtCore.QRect(580, 730, 131, 31)) self.closeWinBtn.setObjectName("closeWinBtn") self.label_picture = QtWidgets.QLabel(dialog) self.label_picture.setGeometry(QtCore.QRect(-180, 0, 1150, 850)) self.label_picture.setStyleSheet("image: url(:/new/back_actor.jpg);") self.label_picture.setText("") self.label_picture.setObjectName("label_picture") self.pushButton = QtWidgets.QPushButton(dialog) self.pushButton.setGeometry(QtCore.QRect(410, 120, 93, 28)) self.pushButton.setObjectName("pushButton") self.label_result = QWebEngineView(self) self.label_result.setGeometry(QtCore.QRect(50, 200, 640, 480)) #self.label_result.setText("") self.label_result.setObjectName("label_result") self.AddTo = QtWidgets.QPushButton(dialog) self.AddTo.setGeometry(QtCore.QRect(310, 730, 121, 28)) self.AddTo.setObjectName("AddTo") self.label = QtWidgets.QLabel(dialog) self.label.setGeometry(QtCore.QRect(50, 120, 41, 31)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label.setFont(font) self.label.setObjectName("label") self.spinBox = QtWidgets.QSpinBox(dialog) self.spinBox.setGeometry(QtCore.QRect(100, 125, 61, 22)) self.spinBox.setMinimum(2015) self.spinBox.setMaximum(2020) self.spinBox.setObjectName("spinBox") self.spinBox_2 = QtWidgets.QSpinBox(dialog) self.spinBox_2.setGeometry(QtCore.QRect(255, 125, 46, 22)) self.spinBox_2.setMinimum(1) self.spinBox_2.setMaximum(20) self.spinBox_2.setObjectName("spinBox_2") self.label_2 = QtWidgets.QLabel(dialog) self.label_2.setGeometry(QtCore.QRect(210, 120, 41, 31)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_2.setFont(font) self.label_2.setObjectName("label_2") self.label_picture.raise_() self.closeWinBtn.raise_() self.pushButton.raise_() self.label_result.raise_() self.AddTo.raise_() self.label.raise_() self.spinBox.raise_() self.spinBox_2.raise_() self.label_2.raise_() self.retranslateUi(dialog) self.closeWinBtn.clicked.connect(dialog.close) QtCore.QMetaObject.connectSlotsByName(dialog) self.pushButton.clicked.connect(self.on_click) self.AddTo.clicked.connect(self.put_into_report) def retranslateUi(self, dialog): _translate = QtCore.QCoreApplication.translate dialog.setWindowTitle(_translate("dialog", "劳模演员")) self.closeWinBtn.setText(_translate("dialog", "返回上一级")) self.pushButton.setText(_translate("dialog", "生成图表")) self.AddTo.setText(_translate("dialog", "加入到数据报表")) self.label.setText(_translate("dialog", "年份")) self.label_2.setText(_translate("dialog", "排名")) def on_click(self, dialog): Actor(self.spinBox.value(), self.spinBox_2.value()) #pixMap = QPixmap("Top_actor.jpg").scaled(self.label_result.width(),self.label_result.height()) #self.label_result.setPixmap(QPixmap("")) #self.label_result.setPixmap(pixMap) pwd = os.getcwd() url_string = os.path.abspath('./SE12_Cache/Actor.html') self.label_result.load(QUrl.fromLocalFile(url_string)) def cut_image(self, dialog): size = self.label_result.size() img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(img) self.label_result.render(painter) self.label_result.render(painter) img.save('./SE12_Cache/Top_actor.png') painter.end() def put_into_report(self, dialog): try: doc = Document('report.docx') except Exception: #不存在文件则新建 self.cut_image(dialog) doc = Document() doc.save('report.docx') doc = Document('report.docx') #插入图片 images = './SE12_Cache/Top_actor.png' # 要插入的图片 doc.add_paragraph('\n') # 添加文字 doc.add_picture(images, width=Inches(6)) # 添加图, 设置宽度 doc.save('report.docx') # 保存路径 print('Add picture to report Succesfully.') else: self.cut_image(dialog) images = './SE12_Cache/Top_actor.png' doc.add_paragraph('\n') doc.add_picture(images, width=Inches(6)) doc.save('report.docx') print('Add picture to report Succesfully.')
class Line(object): def setupUi(self, dialog): dialog.setObjectName("dialog") dialog.resize(742, 750) #dialog.resize(1742, 1750) self.closeWinBtn = QtWidgets.QPushButton(dialog) self.closeWinBtn.setGeometry(QtCore.QRect(580, 690, 131, 31)) self.closeWinBtn.setObjectName("closeWinBtn") self.label_picture = QtWidgets.QLabel(dialog) self.label_picture.setGeometry(QtCore.QRect(-200, 0, 1150, 850)) self.label_picture.setStyleSheet("image: url(:/new/back_line.jpg);") self.label_picture.setText("") self.label_picture.setObjectName("label_picture") self.spinBox_year = QtWidgets.QSpinBox(dialog) self.spinBox_year.setGeometry(QtCore.QRect(110, 120, 61, 22)) self.spinBox_year.setMinimum(2015) self.spinBox_year.setMaximum(2020) self.spinBox_year.setObjectName("spinBox_year") self.label_texts = QtWidgets.QLabel(dialog) self.label_texts.setGeometry(QtCore.QRect(60, 120, 41, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts.setFont(font) self.label_texts.setObjectName("label_texts") self.pushButton = QtWidgets.QPushButton(dialog) self.pushButton.setGeometry(QtCore.QRect(460, 120, 93, 28)) self.pushButton.setObjectName("pushButton") self.AddTo = QtWidgets.QPushButton(dialog) self.AddTo.setGeometry(QtCore.QRect(290, 690, 121, 28)) self.AddTo.setObjectName("AddTo") self.spinBox_year_2 = QtWidgets.QSpinBox(dialog) self.spinBox_year_2.setGeometry(QtCore.QRect(230, 120, 61, 22)) self.spinBox_year_2.setMinimum(2015) self.spinBox_year_2.setMaximum(2020) self.spinBox_year_2.setObjectName("spinBox_year_2") self.spinBox_year_3 = QtWidgets.QSpinBox(dialog) self.spinBox_year_3.setGeometry(QtCore.QRect(355, 120, 61, 22)) self.spinBox_year_3.setMinimum(2015) self.spinBox_year_3.setMaximum(2020) self.spinBox_year_3.setObjectName("spinBox_year_3") self.label_texts_2 = QtWidgets.QLabel(dialog) self.label_texts_2.setGeometry(QtCore.QRect(190, 120, 41, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts_2.setFont(font) self.label_texts_2.setObjectName("label_texts_2") self.label_texts_3 = QtWidgets.QLabel(dialog) self.label_texts_3.setGeometry(QtCore.QRect(310, 120, 41, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts_3.setFont(font) self.label_texts_3.setObjectName("label_texts_3") #self.widget = QtWidgets.QWidget(dialog) self.label_result = QWebEngineView(self) self.label_result.setGeometry(QtCore.QRect(50, 180, 640, 480)) self.label_result.setObjectName("widget") self.label_picture.raise_() self.closeWinBtn.raise_() self.spinBox_year.raise_() self.label_texts.raise_() self.pushButton.raise_() self.AddTo.raise_() self.spinBox_year_2.raise_() self.spinBox_year_3.raise_() self.label_texts_2.raise_() self.label_texts_3.raise_() self.label_result.raise_() self.retranslateUi(dialog) self.closeWinBtn.clicked.connect(dialog.close) QtCore.QMetaObject.connectSlotsByName(dialog) self.pushButton.clicked.connect(self.on_click) self.AddTo.clicked.connect(self.put_into_report) def retranslateUi(self, dialog): _translate = QtCore.QCoreApplication.translate dialog.setWindowTitle(_translate("dialog", "Dialog")) self.closeWinBtn.setText(_translate("dialog", "返回上一级")) self.label_texts.setText(_translate("dialog", "年份")) self.pushButton.setText(_translate("dialog", "生成图表")) self.AddTo.setText(_translate("dialog", "加入到数据报表")) self.label_texts_2.setText(_translate("dialog", "年份")) self.label_texts_3.setText(_translate("dialog", "年份")) def on_click(self,dialog): line(self.spinBox_year.value(), self.spinBox_year_2.value(),self.spinBox_year_3.value()) pwd = os.getcwd() url_string=os.path.abspath('./SE12_Cache/Line.html') self.label_result.load(QUrl.fromLocalFile(url_string)) def cut_image(self, dialog): size = self.label_result.size() img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(img) self.label_result.render(painter) self.label_result.render(painter) img.save('./SE12_Cache/Line.png') painter.end() def put_into_report(self,dialog): try: doc = Document('report.docx') except Exception: #不存在文件则新建 self.cut_image(dialog) doc = Document() doc.save('report.docx') doc = Document('report.docx') #插入图片 images = './SE12_Cache/Line.png' # 要插入的图片 doc.add_paragraph('\n') # 添加文字 doc.add_picture(images, width = Inches(6)) # 添加图, 设置宽度 doc.save('report.docx') # 保存路径 print('Add picture to report Succesfully.') else: self.cut_image(dialog) images = './SE12_Cache/Line.png' doc.add_paragraph('\n') doc.add_picture(images, width = Inches(6)) doc.save('report.docx') print('Add picture to report Succesfully.')
class Big(object): def setupUi(self, dialog): dialog.setObjectName("dialog") dialog.resize(1330, 850) self.closeWinBtn = QtWidgets.QPushButton(dialog) self.closeWinBtn.setGeometry(QtCore.QRect(1160, 780, 131, 31)) self.closeWinBtn.setObjectName("closeWinBtn") self.spinBox_season = QtWidgets.QSpinBox(dialog) self.spinBox_season.setGeometry(QtCore.QRect(640, 60, 46, 22)) self.spinBox_season.setMinimum(1) self.spinBox_season.setMaximum(4) self.spinBox_season.setObjectName("spinBox_season") self.label_picture = QtWidgets.QLabel(dialog) self.label_picture.setGeometry(QtCore.QRect(-50, -110, 1541, 1071)) self.label_picture.setStyleSheet("image: url(:/new/back_big.jpg);") self.label_picture.setText("") self.label_picture.setObjectName("label_picture") self.spinBox_year = QtWidgets.QSpinBox(dialog) self.spinBox_year.setGeometry(QtCore.QRect(530, 60, 61, 22)) self.spinBox_year.setMinimum(2015) self.spinBox_year.setMaximum(2020) self.spinBox_year.setObjectName("spinBox_year") self.label_texts = QtWidgets.QLabel(dialog) self.label_texts.setGeometry(QtCore.QRect(440, 60, 81, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts.setFont(font) self.label_texts.setObjectName("label_texts") self.pushButton = QtWidgets.QPushButton(dialog) self.pushButton.setGeometry(QtCore.QRect(780, 60, 93, 28)) self.pushButton.setObjectName("pushButton") self.label_result1 = QWebEngineView(self) self.label_result1.setGeometry(QtCore.QRect(10, 150, 640, 480)) #self.label_result1.setText("") self.label_result1.setObjectName("label_result1") self.AddTo = QtWidgets.QPushButton(dialog) self.AddTo.setGeometry(QtCore.QRect(260, 700, 121, 28)) self.AddTo.setObjectName("AddTo") self.label_result2 = QWebEngineView(self) self.label_result2.setGeometry(QtCore.QRect(680, 150, 640, 480)) #self.label_result2.setText("") self.label_result2.setObjectName("label_result2") self.AddTo_2 = QtWidgets.QPushButton(dialog) self.AddTo_2.setGeometry(QtCore.QRect(940, 700, 121, 28)) self.AddTo_2.setObjectName("AddTo_2") self.label_texts_2 = QtWidgets.QLabel(dialog) self.label_texts_2.setGeometry(QtCore.QRect(594, 60, 41, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts_2.setFont(font) self.label_texts_2.setObjectName("label_texts_2") self.label_texts_3 = QtWidgets.QLabel(dialog) self.label_texts_3.setGeometry(QtCore.QRect(690, 60, 81, 21)) font = QtGui.QFont() font.setFamily("Agency FB") font.setPointSize(12) self.label_texts_3.setFont(font) self.label_texts_3.setObjectName("label_texts_3") self.label_picture.raise_() self.closeWinBtn.raise_() self.spinBox_season.raise_() self.spinBox_year.raise_() self.label_texts.raise_() self.pushButton.raise_() self.label_result1.raise_() self.AddTo.raise_() self.label_result2.raise_() self.AddTo_2.raise_() self.label_texts_2.raise_() self.label_texts_3.raise_() self.retranslateUi(dialog) self.closeWinBtn.clicked.connect(dialog.close) QtCore.QMetaObject.connectSlotsByName(dialog) self.pushButton.clicked.connect(self.on_click) self.AddTo.clicked.connect(self.put_into_report1) self.AddTo_2.clicked.connect(self.put_into_report2) def retranslateUi(self, dialog): _translate = QtCore.QCoreApplication.translate dialog.setWindowTitle(_translate("dialog", "票房份额")) self.closeWinBtn.setText(_translate("dialog", "返回上一级")) self.label_texts.setText(_translate("dialog", "选择时间")) self.pushButton.setText(_translate("dialog", "生成图表")) self.AddTo.setText(_translate("dialog", "加入到数据报表")) self.AddTo_2.setText(_translate("dialog", "加入到数据报表")) self.label_texts_2.setText(_translate("dialog", "年第")) self.label_texts_3.setText(_translate("dialog", "季度")) def on_click(self, dialog): Straight(self.spinBox_year.value(), self.spinBox_season.value()) pie(self.spinBox_year.value(), self.spinBox_season.value()) pwd = os.getcwd() url_string1 = os.path.abspath('./SE12_Cache/Straight.html') self.label_result1.load(QUrl.fromLocalFile(url_string1)) url_string2 = os.path.abspath('./SE12_Cache/Pie.html') self.label_result2.load(QUrl.fromLocalFile(url_string2)) def cut_image1(self, dialog): size = self.label_result1.size() img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(img) self.label_result1.render(painter) self.label_result1.render(painter) img.save('./SE12_Cache/Straight.png') painter.end() def cut_image2(self, dialog): size = self.label_result2.size() img = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) painter = QtGui.QPainter(img) self.label_result2.render(painter) self.label_result2.render(painter) img.save('./SE12_Cache/Pie.png') painter.end() def put_into_report1(self, dialog): try: doc = Document('report.docx') except Exception: #不存在文件则新建 self.cut_image1(dialog) doc = Document() doc.save('report.docx') doc = Document('report.docx') #插入图片 images = './SE12_Cache/Straight.png' # 要插入的图片 doc.add_paragraph('\n') # 添加文字 doc.add_picture(images, width=Inches(6)) # 添加图, 设置宽度 doc.save('report.docx') # 保存路径 print('Add picture to report Succesfully.') else: self.cut_image1(dialog) images = './SE12_Cache/Straight.png' doc.add_paragraph('\n') doc.add_picture(images, width=Inches(6)) doc.save('report.docx') print('Add picture to report Succesfully.') def put_into_report2(self, dialog): try: doc = Document('report.docx') except Exception: #不存在文件则新建 self.cut_image2(dialog) doc = Document() doc.save('report.docx') doc = Document('report.docx') #插入图片 images = './SE12_Cache/Pie.png' # 要插入的图片 doc.add_paragraph('\n') # 添加文字 doc.add_picture(images, width=Inches(6)) # 添加图, 设置宽度 doc.save('report.docx') # 保存路径 print('Add picture to report Succesfully.') else: self.cut_image2(dialog) images = './SE12_Cache/Pie.png' doc.add_paragraph('\n') doc.add_picture(images, width=Inches(6)) doc.save('report.docx') print('Add picture to report Succesfully.')
class PageThumbnailer(QObject): """ Class implementing a thumbnail creator for web sites. @signal thumbnailCreated(QPixmap) emitted after the thumbnail has been created """ thumbnailCreated = pyqtSignal(QPixmap) def __init__(self, parent=None): """ Constructor @param parent reference to the parent object (QObject) """ super(PageThumbnailer, self).__init__(parent) self.__size = QSize(231, 130) self.__loadTitle = False self.__title = "" self.__url = QUrl() self.__view = QWebEngineView() self.__view.setAttribute(Qt.WA_DontShowOnScreen) self.__view.resize(1920, 1080) self.__view.show() def setSize(self, size): """ Public method to set the size of the image. @param size size of the image (QSize) """ if size.isValid(): self.__size = QSize(size) def setUrl(self, url): """ Public method to set the URL of the site to be thumbnailed. @param url URL of the web site (QUrl) """ if url.isValid(): self.__url = QUrl(url) def url(self): """ Public method to get the URL of the thumbnail. @return URL of the thumbnail (QUrl) """ return QUrl(self.__url) def loadTitle(self): """ Public method to check, if the title is loaded from the web site. @return flag indicating, that the title is loaded (boolean) """ return self.__loadTitle def setLoadTitle(self, load): """ Public method to set a flag indicating to load the title from the web site. @param load flag indicating to load the title (boolean) """ self.__loadTitle = load def title(self): """ Public method to get the title of the thumbnail. @return title of the thumbnail (string) """ if self.__title: title = self.__title else: title = self.__url.host() if not title: title = self.__url.toString() return title def start(self): """ Public method to start the thumbnailing action. """ self.__view.loadFinished.connect(self.__createThumbnail) self.__view.load(self.__url) def __createThumbnail(self, status): """ Private slot creating the thumbnail of the web site. @param status flag indicating a successful load of the web site (boolean) """ if not status: self.thumbnailCreated.emit(QPixmap()) return QTimer.singleShot(1000, self.__grabThumbnail) def __grabThumbnail(self): """ Private slot to grab the thumbnail image from the view. """ self.__title = self.__view.title() image = QImage(self.__view.size(), QImage.Format_ARGB32) painter = QPainter(image) self.__view.render(painter) painter.end() scaledImage = image.scaled(self.__size, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation) self.thumbnailCreated.emit(QPixmap.fromImage(scaledImage))