コード例 #1
0
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()
コード例 #2
0
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()
コード例 #3
0
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()
コード例 #4
0
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()
コード例 #5
0
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