class Web2PyQt5(QWidget, Ui_Form): """ Class documentation goes here. """ def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(Web2PyQt5, self).__init__(parent) self.setupUi(self) self.initUi() def initUi(self): self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 7) self.setWindowFlags(Qt.WindowCloseButtonHint) vLayout = QVBoxLayout() vLayout.setContentsMargins(0, 0, -1, -1) url = QUrl(QFileInfo("./webchannel.html").absoluteFilePath()) self.view = QWebEngineView(self.widget) vLayout.addWidget(self.view) self.widget.setLayout(vLayout) self.view.load(url) @pyqtSlot() def on_pb_submit_clicked(self): """ Slot documentation goes here. """ if self.lineEdit_username.text() == "": QMessageBox.warning(self, "警告", "用户名没有输入") self.lineEdit_username.setFocus() elif self.lineEdit_pwd.text() == "": QMessageBox.warning(self, "警告", "密码没有输入") self.lineEdit_pwd.setFocus() else: name = self.lineEdit_username.text() pwd = self.lineEdit_pwd.text() jscode = "PyQt52WebValue('{}','{}');".format(name, pwd) self.view.page().runJavaScript(jscode) @pyqtSlot() def on_pb_reset_clicked(self): """ PyQt5的输入栏内容清空 """ self.lineEdit_username.setText("") self.lineEdit_pwd.setText("") def setLineEdit(self, list): self.lineEdit_username.setText(list[0]) self.lineEdit_pwd.setText(list[1]) def __del__(self): self.view.deleteLater()
class Web2PyQt5(QWidget, Ui_Form): """ Web像PyQt5传值 """ def __init__(self, parent=None): """ 一些初始设置 """ super(Web2PyQt5, self).__init__(parent) self.setupUi(self) self.initUi() def initUi(self): """ 界面初始设置 """ self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 7) # QSplitter的窗口伸缩因子 self.setWindowFlags(Qt.WindowCloseButtonHint) # 只有关闭按钮 vLayout = QVBoxLayout() vLayout.setContentsMargins(0, 0, -1, -1) url = QUrl(QFileInfo("./webchannel.html").absoluteFilePath()) # 绝对路径 self.view = QWebEngineView(self.widget) vLayout.addWidget(self.view) self.widget.setLayout(vLayout) self.view.load(url) # 读取并载入webchannel.html @pyqtSlot() def on_pb_submit_clicked(self): """ 用户名和密码提交 """ if self.lineEdit_username.text() == "": QMessageBox.warning(self, "警告", "用户名没有输入") self.lineEdit_username.setFocus() elif self.lineEdit_pwd.text() == "": QMessageBox.warning(self, "警告", "密码没有输入") self.lineEdit_pwd.setFocus() else: name = self.lineEdit_username.text() pwd = self.lineEdit_pwd.text() jscode = "PyQt52WebValue('{}','{}');".format(name, pwd) self.view.page().runJavaScript(jscode) # 运行javascript代码 @pyqtSlot() def on_pb_reset_clicked(self): """ PyQt5的输入栏内容清空--重置 """ self.lineEdit_username.setText("") self.lineEdit_pwd.setText("") def setLineEdit(self, list): ''' 根据交互值设置用户名和密码 ''' self.lineEdit_username.setText(list[0]) self.lineEdit_pwd.setText(list[1]) def __del__(self): ''' 删除相关对象 ''' self.view.deleteLater()
class ChromiumBrowserTab(BrowserTab): def __init__(self, render_options, verbosity): super().__init__(render_options, verbosity) self.profile = QWebEngineProfile() # don't share cookies self.web_page = ChromiumWebPage(self.profile) self.web_view = QWebEngineView() self.web_view.setPage(self.web_page) self.web_view.setAttribute(Qt.WA_DeleteOnClose, True) # TODO: is it ok? :) # self.web_view.setAttribute(Qt.WA_DontShowOnScreen, True) # FIXME: required for screenshots? # Also, without .show() in JS window.innerWidth/innerHeight are zeros self.web_view.show() self._setup_webpage_events() self._set_default_webpage_options() self._html_d = None # ensure that default window size is not 640x480. self.set_viewport(defaults.VIEWPORT_SIZE) def _setup_webpage_events(self): self._load_finished = WrappedSignal(self.web_view.loadFinished) self._render_terminated = WrappedSignal(self.web_view.renderProcessTerminated) self.web_view.renderProcessTerminated.connect(self._on_render_terminated) self.web_view.loadFinished.connect(self._on_load_finished) # main_frame.urlChanged.connect(self._on_url_changed) # main_frame.javaScriptWindowObjectCleared.connect( # self._on_javascript_window_object_cleared) # self.logger.add_web_page(self.web_page) def _set_default_webpage_options(self): """ Set QWebPage options. TODO: allow to customize defaults. """ settings = self.web_page.settings() settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True) settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, False) settings.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True) # TODO: requires Qt 5.10 # settings.setAttribute(QWebEngineSettings.ShowScrollBars, False) # TODO # if self.visible: # settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) # TODO: options # self.set_js_enabled(True) # self.set_plugins_enabled(defaults.PLUGINS_ENABLED) # self.set_request_body_enabled(defaults.REQUEST_BODY_ENABLED) # self.set_response_body_enabled(defaults.RESPONSE_BODY_ENABLED) # self.set_indexeddb_enabled(defaults.INDEXEDDB_ENABLED) # self.set_webgl_enabled(defaults.WEBGL_ENABLED) # self.set_html5_media_enabled(defaults.HTML5_MEDIA_ENABLED) # self.set_media_source_enabled(defaults.MEDIA_SOURCE_ENABLED) def go(self, url, callback, errback): callback_id = self._load_finished.connect( self._on_content_ready, callback=callback, errback=errback, ) self.logger.log("callback %s is connected to loadFinished" % callback_id, min_level=3) self.web_view.load(QUrl(url)) @skip_if_closing def _on_content_ready(self, ok, callback, errback, callback_id): """ This method is called when a QWebEnginePage finishes loading. """ self.logger.log("loadFinished: disconnecting callback %s" % callback_id, min_level=3) self._load_finished.disconnect(callback_id) if ok: callback() else: error_info = RenderErrorInfo( type='Unknown', code=0, text="loadFinished ok=False", url=self.web_view.url().toString() ) errback(error_info) def _on_load_finished(self, ok): self.logger.log("loadFinished, ok=%s" % ok, min_level=2) def _on_render_terminated(self, status, code): status_details = RenderProcessTerminationStatus.get(status, 'unknown') self.logger.log("renderProcessTerminated: %s (%s), exit_code=%s" % ( status, status_details, code), min_level=1) def html(self): """ Return HTML of the current main frame """ self.logger.log("getting HTML", min_level=2) if self._html_d is not None: self.logger.log("HTML is already requested", min_level=1) return self._html_d self._html_d = defer.Deferred() self.web_view.page().toHtml(self._on_html_ready) return self._html_d def _on_html_ready(self, html): self.logger.log("HTML ready", min_level=2) self._html_d.callback(html) self._html_d = None def png(self, width=None, height=None, b64=False, render_all=False, scale_method=None, region=None): """ Return screenshot in PNG format """ # FIXME: move to base class self.logger.log( "Getting PNG: width=%s, height=%s, " "render_all=%s, scale_method=%s, region=%s" % (width, height, render_all, scale_method, region), min_level=2) if render_all: raise ValueError("render_all=True is not supported yet") image = self._get_image('PNG', width, height, render_all, scale_method, region=region) result = image.to_png() if b64: result = base64.b64encode(result).decode('utf-8') # self.store_har_timing("_onPngRendered") return result def jpeg(self, width=None, height=None, b64=False, render_all=False, scale_method=None, quality=None, region=None): """ Return screenshot in JPEG format. """ # FIXME: move to base class self.logger.log( "Getting JPEG: width=%s, height=%s, " "render_all=%s, scale_method=%s, quality=%s, region=%s" % (width, height, render_all, scale_method, quality, region), min_level=2) if render_all: raise ValueError("render_all=True is not supported yet") image = self._get_image('JPEG', width, height, render_all, scale_method, region=region) result = image.to_jpeg(quality=quality) if b64: result = base64.b64encode(result).decode('utf-8') # self.store_har_timing("_onJpegRendered") return result def _get_image(self, image_format, width, height, render_all, scale_method, region): renderer = QtChromiumScreenshotRenderer( self.web_page, self.logger, image_format, width=width, height=height, scale_method=scale_method, region=region) return renderer.render_qwebpage() def set_viewport(self, size, raise_if_empty=False): """ Set viewport size. If size is "full" viewport size is detected automatically. If can also be "<width>x<height>". FIXME: Currently the implementation just resizes the window, which causes Splash to crash on large sizes(?). Actully it is not changing the viewport. XXX: As an effect, this function changes window.outerWidth/outerHeight, while in Webkit implementation window.innerWidth/innerHeight is changed. """ if size == 'full': size = self.web_page.contentsSize() self.logger.log("Contents size: %s" % size, min_level=2) if size.isEmpty(): if raise_if_empty: raise RuntimeError("Cannot detect viewport size") else: size = defaults.VIEWPORT_SIZE self.logger.log("Viewport is empty, falling back to: %s" % size) if not isinstance(size, (QSize, QSizeF)): validate_size_str(size) size = parse_size(size) w, h = int(size.width()), int(size.height()) # XXX: it was crashing with large windows, but then the problem # seemed to go away. Need to keep an eye on it. # # FIXME: don't resize the window? # # FIXME: figure out exact limits # MAX_WIDTH = 1280 # MAX_HEIGHT = 1920 # # if w > MAX_WIDTH: # raise RuntimeError("Width {} > {} is currently prohibited".format( # w, MAX_WIDTH # )) # # if h > MAX_HEIGHT: # raise RuntimeError("Height {} > {} is currently prohibited".format( # h, MAX_HEIGHT # )) self.web_view.resize(w, h) # self._force_relayout() self.logger.log("viewport size is set to %sx%s" % (w, h), min_level=2) self.logger.log("real viewport size: %s" % self.web_view.size(), min_level=2) return w, h def stop_loading(self): self.logger.log("stop_loading", min_level=2) self.web_view.stop() @skip_if_closing def close(self): """ Destroy this tab """ super().close() self.web_view.stop() self.web_view.close() self.web_page.deleteLater() self.web_view.deleteLater()
class PiChart(QWidget, Ui_Form): """ 饼图演示 """ def __init__(self, parent=None): """ 一些初始设置 """ super(PiChart, self).__init__(parent) self.setupUi(self) self.initUi() def initUi(self): """ 一些界面配置 """ self.setWindowFlags(Qt.WindowCloseButtonHint) # 窗口上只有关闭按钮 self.splitter.setOpaqueResize(False) # QSplitter调整大小不透明,默认是True self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 9) # 按照窗口索引(0,1)分别增加1、9个伸缩因子 self.view = QWebEngineView(self.widget) vv = QVBoxLayout() vv.addWidget(self.view) self.widget.setLayout(vv) with codecs.open("pie-simple.html", "r", "utf-8") as f: html = f.read() # 读取html文件 self.view.setHtml(html) # Web视图的内容设置为指定的html内容;无法显示大于2 MB的内容,切记!!! self.time = QTimer() def showPi(self): """ 显示饼形图 """ food = self.spinBox_food.value() rent = self.spinBox_rent.value() electricity = self.spinBox_electricity.value() traffic = self.spinBox_traffic.value() relationship = self.spinBox_relationship.value() taobao = self.spinBox_taobao.value() # 将微调框的数值赋值给变量 jscode = "showPiChart({}, {}, {}, {}, {}, {});".format(food, traffic, relationship, rent, electricity, taobao) self.view.page().runJavaScript(jscode) # 加载运行JavaScript def autoShow(self): """ 自动演示 """ self.spinBox_food.setValue(random.randint(100, 10000)) self.spinBox_rent.setValue(random.randint(100, 10000)) self.spinBox_electricity.setValue(random.randint(100, 1000)) self.spinBox_traffic.setValue(random.randint(100, 2000)) self.spinBox_relationship.setValue(random.randint(100, 3000)) self.spinBox_taobao.setValue(random.randint(100, 10000)) # 数值随机生成 @pyqtSlot(bool) def on_checkBox_toggled(self, flag): """ 复选框选中时触发 """ if flag: self.time.start(1000) self.time.timeout.connect(self.autoShow) # 选中开始计时 else: self.time.stop() # 未选中停止计时 @pyqtSlot(int) def on_spinBox_food_valueChanged(self, n): """ 伙食消费微调框数值改变时触发 """ self.showPi() @pyqtSlot(int) def on_spinBox_rent_valueChanged(self): """ 房租微调框数值改变时触发 """ self.showPi() @pyqtSlot(int) def on_spinBox_electricity_valueChanged(self): """ 水电气微调框数值改变时触发 """ self.showPi() @pyqtSlot(int) def on_spinBox_traffic_valueChanged(self): """ 交通微调框数值改变时触发 """ self.showPi() @pyqtSlot(int) def on_spinBox_relationship_valueChanged(self): """ 人情往来微调框数值改变时触发 """ self.showPi() @pyqtSlot(int) def on_spinBox_taobao_valueChanged(self): """ 淘宝网购微调框数值改变时触发 """ self.showPi() def __del__(self): ''' 删除相关对象 ''' self.view.deleteLater()
class MainDialog(QDialog, Ui_Form): def __init__(self, parent=None): super(MainDialog, self).__init__(parent) self.setupUi(self) self.setWindowIcon(QIcon(resource_path('assets/weather.ico'))) icon = QIcon() icon.addPixmap(QPixmap(resource_path("assets/search.png")), QIcon.Normal, QIcon.Off) self.pushButton.setIcon(icon) self.pushButton.setIconSize(QtCore.QSize(30, 30)) self.pushButton.setAutoRepeatDelay(200) self.flag = 0 self.pushButton.clicked.connect(self.push_info) def push_info(self): city_name = self.textEdit.toPlainText().strip() if len(city_name) != 0: try: # 判断查询 1 天还是 7 天的天气情况 if self.radioButton.isChecked(): # 查询 1 天的天气情况 city_ip = gw.get_city_ip(city_name) left_info = gw.get_base_weather(city_ip) right_info = gw.get_additional_weather(city_ip) self.textEdit_2.setText(left_info) self.textEdit_3.setText(right_info) gw.plot_1d_weather(city_ip) else: # 查询 7 天的天气情况 city_ip = gw.get_city_ip(city_name) gw.plot_7d_weather(city_ip) self.textEdit_2.setText("") self.textEdit_3.setText("") # 判断第一次查询 # self.flag = 0 表示第一次查询 if self.flag: # 删除已有的浏览器控件 self.browser.deleteLater() # 重新添加浏览器控件 self.browser = QWebEngineView() # url = "file://////" + resource_path("time-temp-curve.html").replace("\\", "/") url = resource_path("time-temp-curve.html").replace("\\", "/") self.browser.load(QUrl(url)) self.horizontalLayout.addWidget(self.browser) else: self.browser = QWebEngineView() # url = "file://////" + resource_path("time-temp-curve.html").replace("\\", "/") url = resource_path("time-temp-curve.html").replace("\\", "/") self.browser.load(QUrl(url)) self.horizontalLayout.addWidget(self.browser) self.flag = 1 except: self.textEdit_2.setText('查询失败!\n\n请检查城市名输入是否正确') self.textEdit_3.setText('') if self.flag: self.browser.deleteLater() self.flag = 0 else: self.textEdit_2.setText('查询失败!\n\n请输入城市名') self.textEdit_3.setText('') if self.flag: self.browser.deleteLater() self.flag = 0