コード例 #1
0
ファイル: test.py プロジェクト: yyk123/XwareDesktop
class MainWidow(QWidget):
    def __init__(self):

        super().__init__()
        self.view=QWebEngineView()
        self.myprofile=self.getProfile()
        self.page=QWebEnginePage(self.myprofile,None)

        # self.channel=QWebChannel()
        # self.myobject=myObject()
        # self.channel.registerObject("xdpy", self.myobject)
        # self.page.setWebChannel(self.channel)

        self.page.settings().AllowRunningInsecureContent=True;
        self.page.settings().JavascriptEnabled=True;
        self.view.page=self.page
        self.url=QUrl("")
        self.view.page.load(self.url)
        self.view.show()
        self.view.settings().JavascriptEnabled=True
    def js_callback(self,result):
        print("js_callback:{}".format(result))
    def injectJS(self,sourceCode,name):
        script = QWebEngineScript();
        script.setSourceCode(sourceCode)
        script.setName(name)
        script.setInjectionPoint(QWebEngineScript.DocumentCreation)
        script.setWorldId(QWebEngineScript.MainWorld)
        script.setRunsOnSubFrames(True)
        self.view.page.scripts().insert(script)
        self.page.scripts().insert(script)

    def getProfile(self):
        profile=QWebEngineProfile("myProfile")
        profile.cachePath="/home/yyk/Desktop/cache"
        jsFile = constants.QTWEBCHANNELJS_FILE
        with open(jsFile, encoding="UTF-8") as file:
            js = file.read()
        script = QWebEngineScript();
        script.setSourceCode(js)
        script.setName('qwebchannel.js')
        script.setInjectionPoint(QWebEngineScript.DocumentCreation)
        script.setWorldId(QWebEngineScript.MainWorld)
        script.setRunsOnSubFrames(False)
        profile.scripts().insert(script)
        return profile
コード例 #2
0
ファイル: test.py プロジェクト: yyk123/XwareDesktop
    def __init__(self):

        super().__init__()
        self.view=QWebEngineView()
        self.myprofile=self.getProfile()
        self.page=QWebEnginePage(self.myprofile,None)

        # self.channel=QWebChannel()
        # self.myobject=myObject()
        # self.channel.registerObject("xdpy", self.myobject)
        # self.page.setWebChannel(self.channel)

        self.page.settings().AllowRunningInsecureContent=True;
        self.page.settings().JavascriptEnabled=True;
        self.view.page=self.page
        self.url=QUrl("")
        self.view.page.load(self.url)
        self.view.show()
        self.view.settings().JavascriptEnabled=True
コード例 #3
0
ファイル: webbuffer.py プロジェクト: jagguli/webmacs
 def load(self, url):
     if not isinstance(url, QUrl):
         url = QUrl.fromUserInput(url)
     self.__delay_loading_url = None
     return QWebEnginePage.load(self, url)
コード例 #4
0
class RequestWidget(QWidget):

    def __init__(self, parent, keyList, request=None):
        super().__init__(parent)

        self.keyList = keyList

        # INITIALIZE POLYGON MANAGEMENT

        self.polygonSettings = []
        self.polygonActivated = False
        self.html = ""
        self.webChannel = QWebChannel()
        self.webChannel.registerObject('request', self)
        self.polygonPage = QWebEnginePage()
        self.polygonPage.setWebChannel(self.webChannel)

        # INITIALIZE UI

        self.layout = self.__generateLayout__()
        self.setLayout(self.layout)

        elementsTypeGB, self.nodesCB, self.waysCB, self.relCB, self.areasCB = self.__generateTypeWidget__()
        self.layout.addRow("ELEMENTS TYPE", elementsTypeGB)
        self.layout.addRow(HorizontalLine(self))

        self.locationNameWidget = self.__generateLocationWidget__()
        self.layout.addRow("LOCATION", self.locationNameWidget)
        self.layout.addRow(HorizontalLine(self))

        filtersButtons, self.filtersWidget, self.filtersLayout = self.__generateFiltersWidget__()
        self.layout.addRow("FILTERS", filtersButtons)
        self.layout.addRow(self.filtersWidget)
        self.layout.addRow(HorizontalLine(self))

        polygonButtons = self.__generatePolygonWidget__()
        self.layout.addRow("POLYGON", polygonButtons)
        self.layout.addRow(HorizontalLine(self))

        self.surroundGB, self.aroundRadiusEdit = self.__generateSurroundingWidget__()
        self.layout.addRow("SURROUNDINGS", self.surroundGB)
        self.layout.addRow(HorizontalLine(self))

        self.idsWidget = self.__generateIdsWidget__()
        self.layout.addRow("IDS", self.idsWidget)

        # SETTING DATA

        if request is None:
            self.requestName = SetNameManagement.getUniqueSetName()
        else:
            self.__setRequest__(request)

    # UI COMPONENTS

    def __generateLayout__(self):
        layout = QFormLayout()
        layout.setContentsMargins(10, 10, 10, 10)

        layout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow)
        layout.setLabelAlignment(Qt.AlignLeft)
        layout.setFormAlignment(Qt.AlignLeft | Qt.AlignTop)

        return layout

    def __generateLocationWidget__(self):
        locationNameWidget = QLineEdit()
        locationNameWidget.setPlaceholderText("Areas: 'New York', 'Italy'...")
        locationNameWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        return locationNameWidget

    def __generatePolygonWidget__(self):
        return WidgetFactory.buildIconButtonGroup([
            {"image": "polygon.png", "tooltip": "Draw polygon", "checkable": True, "action": self.enableDisablePolygon},
            {"image": "reset.png", "tooltip": "Remove polygon", "checkable": False, "action": self.clearPolygon}
        ])

    def __generateTypeWidget__(self):
        elementsTypeGB = QWidget()
        elementsTypeLayout = QVBoxLayout()
        elementsTypeGB.setLayout(elementsTypeLayout)
        elementsTypeLayout.setContentsMargins(10, 0, 0, 0)
        elementsTypeLayout.setSpacing(0)

        nodesCB = QCheckBox(self.tr("&Nodes"))
        elementsTypeLayout.addWidget(nodesCB)

        waysCB = QCheckBox(self.tr("&Ways"))
        waysCB.setChecked(True)
        elementsTypeLayout.addWidget(waysCB)

        relCB = QCheckBox(self.tr("&Relations"))
        elementsTypeLayout.addWidget(relCB)

        areasCB = QCheckBox(self.tr("&Areas"))
        areasCB.stateChanged.connect(self.__onAreaSelected__)
        elementsTypeLayout.addWidget(areasCB)

        nodesCB.stateChanged.connect(lambda b: self.areasCB.setChecked(False) if b else None)
        waysCB.stateChanged.connect(lambda b: self.areasCB.setChecked(False) if b else None)
        relCB.stateChanged.connect(lambda b: self.areasCB.setChecked(False) if b else None)

        return elementsTypeGB, nodesCB, waysCB, relCB, areasCB

    def __generateSurroundingWidget__(self):
        surroundGB = QGroupBox()
        surroundGB.setFlat(True)
        surroundLayout = QVBoxLayout()
        surroundLayout.setContentsMargins(0, 0, 0, 0)

        noneRB = QRadioButton(self.tr("&None"))
        noneRB.setObjectName("None")
        noneRB.setChecked(True)
        surroundLayout.addWidget(noneRB)

        adjacentRB = QRadioButton(self.tr("&Adjacent streets"))
        adjacentRB.setObjectName("Adjacent")
        surroundLayout.addWidget(adjacentRB)

        aroundRB = QRadioButton(self.tr("&Streets around"))
        aroundRB.setObjectName("Around")
        surroundLayout.addWidget(aroundRB)

        aroundRadiusEdit = QLineEdit("")
        aroundRadiusEdit.hide()
        aroundRadiusEdit.setPlaceholderText("Radius in meters")
        aroundRadiusEdit.setValidator(QIntValidator(0, 10000000, surroundGB))
        aroundRB.toggled.connect(lambda b: aroundRadiusEdit.show() if b else aroundRadiusEdit.hide())
        surroundLayout.addWidget(aroundRadiusEdit)

        surroundGB.setLayout(surroundLayout)

        return surroundGB, aroundRadiusEdit

    def __generateFiltersWidget__(self):
        filtersButtons = QWidget()
        filtersButtonsLayout = QHBoxLayout()
        filtersButtons.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        filtersButtonsLayout.setAlignment(Qt.AlignRight)
        filtersButtonsLayout.setSpacing(0)
        filtersButtonsLayout.setContentsMargins(0, 0, 0, 0)
        filtersButtons.setLayout(filtersButtonsLayout)

        addFilterButton = IconButton(QIcon(os.path.join(picturesDir, "add.png")),
                                     filtersButtons.windowHandle(),
                                     filtersButtons.height())
        addFilterButton.setToolTip("Add filter")
        addFilterButton.setFlat(True)
        addFilterButton.setStyleSheet("""QPushButton::menu-indicator{image: none;}""")

        filtersMenu = QMenu()

        equalAct = QAction('Equal', self)
        equalAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.EQUAL))
        filtersMenu.addAction(equalAct)

        maxAct = QAction('Maximum', self)
        maxAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.AT_MOST))
        filtersMenu.addAction(maxAct)

        minAct = QAction('Minimum', self)
        minAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.AT_LEAST))
        filtersMenu.addAction(minAct)

        containAllAct = QAction('Contain all', self)
        containAllAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.CONTAIN_ALL))
        filtersMenu.addAction(containAllAct)

        oneOfAct = QAction('Is one of', self)
        oneOfAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.IS_ONE_OF))
        filtersMenu.addAction(oneOfAct)

        hasKeyAct = QAction('Has key', self)
        hasKeyAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.HAS_KEY))
        filtersMenu.addAction(hasKeyAct)

        hasOneKeyAct = QAction('Has one key', self)
        hasOneKeyAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.HAS_ONE_KEY))
        filtersMenu.addAction(hasOneKeyAct)

        hasNotKeyAct = QAction('Has not key', self)
        hasNotKeyAct.triggered.connect(lambda: self.addFilterByComparison(comparison=TagComparison.HAS_NOT_KEY))
        filtersMenu.addAction(hasNotKeyAct)

        addFilterButton.setMenu(filtersMenu)

        filtersButtonsLayout.addWidget(addFilterButton)

        filtersWidget = QWidget(self)
        filtersLayout = QVBoxLayout()
        filtersLayout.setContentsMargins(10, 10, 10, 10)
        filtersWidget.setLayout(filtersLayout)

        return filtersButtons, filtersWidget, filtersLayout

    def __generateIdsWidget__(self):
        return VariableInputList(0, "Numeric id", QRegularExpressionValidator(QRegularExpression("^[0-9]+$")))

    # REQUEST GETTERS

    def __getLocationName__(self):
        return self.locationNameWidget.text()

    def __getType__(self):
        return OsmType.getType(self.nodesCB.isChecked(), self.waysCB.isChecked(),
                               self.relCB.isChecked(), self.areasCB.isChecked())

    def __getSelectedSurrounding__(self):
        switcher = {
            "Adjacent": Surround.ADJACENT,
            "Around": Surround.AROUND,
            "None": Surround.NONE
        }
        selectedSurrounding = [b for b in self.surroundGB.findChildren(QRadioButton) if b.isChecked()][0]
        return switcher.get(selectedSurrounding.objectName())

    @pyqtSlot(QJsonValue)
    def __setPolygons__(self, val):
        self.polygonSettings = []
        for point in val.toArray():
            self.polygonSettings.append([point["lat"].toDouble(), point["lng"].toDouble()])

    def __getPolygon__(self):
        return self.polygonSettings

    def getAroundRadius(self):
        return int(self.aroundRadiusEdit.text()) if len(self.aroundRadiusEdit.text()) > 0 else 100

    def getRequest(self):
        request = OverpassRequest(self.__getType__(),
                                  self.__getSelectedSurrounding__(),
                                  self.requestName,
                                  self.getAroundRadius())
        request.setLocationName(self.__getLocationName__())
        if request.locationId is None and request.locationName != "":
            logging.warning("Location name not found in the request '{}'. It will be ignored.".format(self.requestName))
        request.addPolygon(self.__getPolygon__())
        request.setIds(self.__getIds__())
        for filterWidget in self.filtersWidget.findChildren(FilterWidget):
            try:
                request.addFilter(filterWidget.getFilter())
            except BadFilterAttributes as e:
                raise BadFilterAttributes("Error in one of the filters of request '{}'. {}".format(self.requestName, str(e)))
        return request

    def getName(self):
        return self.requestName

    def getMap(self):
        return self.polygonPage

    def __getIds__(self):
        return self.idsWidget.getItems()

    # REQUEST SETTERS

    def addFilterByComparison(self, comparison):
        newFilterWidget = FilterWidget(self.filtersWidget, comparison, self.keyList)
        self.filtersLayout.addWidget(newFilterWidget)

    def addFilter(self, filter):
        currentKeys = {filter.getKey(): filter for filter in self.findChildren(FilterWidget)}
        if filter.key != "" and filter.key in currentKeys.keys():
            logging.warning("The key {} is used more than once in the set {}.".format(filter.key, self.getName()))
        newFilterWidget = FilterWidget(self.filtersWidget, filter.comparison, self.keyList)
        self.filtersLayout.addWidget(newFilterWidget)
        newFilterWidget.setFilter(filter)

    def __setLocationName__(self, locationName):
        self.locationNameWidget.setText(locationName)

    def __setType__(self, requestType):
        typeConfig = OsmType.getConfig(requestType)
        self.waysCB.setChecked(typeConfig["way"])
        self.nodesCB.setChecked(typeConfig["node"])
        self.relCB.setChecked(typeConfig["rel"])
        self.areasCB.setChecked(typeConfig["area"])

    def __setSelectedSurrounding__(self, surroundValue):
        if surroundValue == Surround.ADJACENT:
            self.surroundGB.findChild(QRadioButton, "Adjacent").setChecked(True)
        elif surroundValue == Surround.AROUND:
            self.surroundGB.findChild(QRadioButton, "Around").setChecked(True)
        elif surroundValue == Surround.NONE:
            self.surroundGB.findChild(QRadioButton, "None").setChecked(True)

    def changePolygon(self, coors):
        self.polygonSettings = coors
        if self.html != "":
            self.changePage(self.html)

    def setAroundRadius(self, radius):
        return self.aroundRadiusEdit.setText(str(radius))

    def __setRequest__(self, request):
        self.requestName = request.name
        self.__setType__(request.type)
        self.setAroundRadius(request.aroundRadius)
        self.__setSelectedSurrounding__(request.surrounding)
        for filterWidget in self.filtersWidget.findChildren(FilterWidget):
            filterWidget.deleteLater()
        for filter in request.filters:
            self.addFilter(filter)
        self.__setLocationName__(request.locationName)
        self.setIds(request.ids)
        self.changePolygon(request.polygon)

    def changePage(self, html):
        self.html = html
        soup = bs4.BeautifulSoup(html, features="html.parser")
        js = soup.new_tag("script")
        js.string = (JS_SCRIPT % (str(self.polygonSettings), str(self.polygonActivated).lower()))
        soup.append(js)
        soup.head.append(soup.new_tag("script", src="qrc:///qtwebchannel/qwebchannel.js"))
        htmlFileName = os.path.join(tempDir, "{}.html".format(self.requestName))
        with open(htmlFileName, "w+") as f:
            f.write(str(soup))

        self.polygonPage.load(QUrl.fromLocalFile(htmlFileName))

    def setIds(self, ids=None):
        self.idsWidget.setItems(ids)

    def addId(self, newId=0):
        self.idsWidget.addItem(newId)

    def __del__(self):
        SetNameManagement.releaseName(self.requestName)

    # SIGNALS

    def __onAreaSelected__(self):
        self.nodesCB.setChecked(False)
        self.waysCB.setChecked(False)
        self.relCB.setChecked(False)

    def clearPolygon(self):
        self.polygonPage.runJavaScript("cleanPolygon();", lambda x: logging.debug("LINE"))

    def enableDisablePolygon(self, checked):
        self.polygonActivated = checked
        self.polygonPage.runJavaScript("enablePolygon();" if checked else "disablePolygon();")
コード例 #5
0
ファイル: auth_widget.py プロジェクト: ytfqj/deriva-qt
class AuthWidget(QWebEngineView):
    config = None
    config_file = DEFAULT_CONFIG_FILE
    credential = DEFAULT_CREDENTIAL
    credential_file = None
    auth_url = None
    authn_session = None
    authn_session_page = None
    authn_cookie_name = None
    authn_expires = time.time()
    cookie_persistence = False
    _success_callback = None
    _session = requests.session()
    token = None

    def __init__(self,
                 parent,
                 config=None,
                 credential_file=None,
                 cookie_persistence=False):
        super(AuthWidget, self).__init__(parent)
        self.cookie_persistence = cookie_persistence
        self._timer = QTimer(self)
        self._timer.timeout.connect(self._onTimerFired)
        self.configure(config, credential_file)
        info = "%s v%s [Python %s, %s]" % (self.__class__.__name__, VERSION,
                                           platform.python_version(),
                                           platform.platform(aliased=True))
        logging.info("Initializing authorization provider: %s" % info)
        # logging.getLogger().setLevel(logging.TRACE)

    def configure(self, config, credential_file):
        self.config = config if config else read_config(
            self.config_file, create_default=True, default=DEFAULT_CONFIG)
        self.credential_file = credential_file
        host = self.config.get("host")
        if not host:
            self.setHtml(
                ERROR_HTML %
                "Could not locate hostname parameter in configuration.")
            return
        self.auth_url = QUrl()
        self.auth_url.setScheme(config.get("protocol", "https"))
        self.auth_url.setHost(host)
        if config.get("port") is not None:
            self.auth_url.setPort(config["port"])
        self.authn_cookie_name = self.config.get("cookie_name", "webauthn")

        retries = Retry(
            connect=DEFAULT_SESSION_CONFIG['retry_connect'],
            read=DEFAULT_SESSION_CONFIG['retry_read'],
            backoff_factor=DEFAULT_SESSION_CONFIG['retry_backoff_factor'],
            status_forcelist=DEFAULT_SESSION_CONFIG['retry_status_forcelist'])

        self._session.mount(self.auth_url.toString() + '/',
                            HTTPAdapter(max_retries=retries))

    def authenticated(self):
        if self.authn_session is None:
            return False

        now = time.time()
        if now >= self.authn_expires:
            return False

        return True

    def login(self):
        if not (self.auth_url and
                (self.auth_url.host() and self.auth_url.scheme())):
            logging.error(
                "Missing or invalid hostname parameter in configuration.")
            return
        logging.info("Authenticating with host: %s" % self.auth_url.toString())
        qApp.setOverrideCursor(Qt.WaitCursor)
        self._cleanup()
        self.setHtml(DEFAULT_HTML)
        self.authn_session_page = \
            QWebEnginePage(QWebEngineProfile(self), self) if not self.cookie_persistence else QWebEnginePage(self)
        self.authn_session_page.loadProgress.connect(self._onLoadProgress)
        self.authn_session_page.loadFinished.connect(self._onLoadFinished)
        self.authn_session_page.profile().cookieStore().cookieAdded.connect(
            self._onCookieAdded)
        self.authn_session_page.profile().cookieStore().cookieRemoved.connect(
            self._onCookieRemoved)
        self.authn_session_page.setUrl(
            QUrl(self.auth_url.toString() + "/authn/preauth"))

    def logout(self, delete_cookies=False):
        if not (self.auth_url and
                (self.auth_url.host() and self.auth_url.scheme())):
            return
        if not self.authenticated():
            return
        try:
            logging.info("Logging out of host: %s" % self.auth_url.toString())
            if delete_cookies and self.cookie_persistence:
                self.authn_session_page.profile().cookieStore(
                ).deleteAllCookies()
            self._session.delete(self.auth_url.toString() + "/authn/session")
        except Exception as e:
            logging.warning("Logout error: %s" % format_exception(e))
        self._cleanup()

    def setSuccessCallback(self, callback=None):
        self._success_callback = callback

    def setStatus(self, message):
        if self.window().statusBar is not None:
            self.window().statusBar().showMessage(message)

    def _execSuccessCallback(self):
        if self._success_callback:
            self._success_callback(host=self.auth_url.host(),
                                   credential=self.credential)

    def _onTimerFired(self):
        if not self.authenticated():
            self.authn_session = None
            return
        resp = self._session.put(self.auth_url.toString() + "/authn/session")
        seconds_remaining = self.authn_session['seconds_remaining']
        self.authn_expires = time.time() + seconds_remaining + 1
        if resp.ok:
            logging.trace("webauthn session:\n%s\n", resp.json())
            logging.info("Session refreshed for: %s" % self.auth_url.host())
        else:
            logging.warning(
                "Unable to refresh session for: %s. Server responded: %s" %
                (self.auth_url.host(),
                 str.format(
                     "%s %s: %s" %
                     (resp.status_code, resp.reason, resp.content.decode()))))

    def _onSessionContent(self, content):
        try:
            self.setHtml(SUCCESS_HTML)
            self.authn_session = json.loads(content)
            seconds_remaining = self.authn_session['seconds_remaining']
            if not self._timer.isActive():
                interval = seconds_remaining // 2
                logging.info(
                    "Authentication successful for [%s]: credential refresh in %d seconds."
                    % (self.auth_url.toString(), interval))
                self._timer.start(interval * 1000)
            self.authn_expires = time.time() + seconds_remaining + 1
            logging.trace("webauthn session:\n%s\n",
                          json.dumps(self.authn_session, indent=2))
            qApp.restoreOverrideCursor()
            QTimer.singleShot(100, self._execSuccessCallback)
        except (ValueError, Exception) as e:
            logging.error(format_exception(e))
            self.setHtml(ERROR_HTML % content)

    def _onPreAuthContent(self, content):
        try:
            if not content:
                logging.debug("no preauth content")
                return
            preauth = json.loads(content)
            logging.trace("webauthn preauth:\n%s\n",
                          json.dumps(preauth, indent=2))
            qApp.setOverrideCursor(Qt.WaitCursor)
            self.authn_session_page.setUrl(QUrl(preauth["redirect_url"]))
        except (ValueError, Exception) as e:
            logging.error(format_exception(e))
            self.setHtml(ERROR_HTML % content)

    def _onLoadFinished(self, result):
        qApp.restoreOverrideCursor()
        if not result:
            logging.debug("Page load error: %s" %
                          self.authn_session_page.url().toDisplayString())
            self.setPage(self.authn_session_page)
            return
        if self.authn_session_page.url().path() == "/authn/preauth":
            self.authn_session_page.toPlainText(self._onPreAuthContent)
        elif self.authn_session_page.url().path() == "/authn/session":
            self.authn_session_page.toPlainText(self._onSessionContent)
        else:
            self.setPage(self.authn_session_page)

    def _onLoadProgress(self, progress):
        self.setStatus("Loading page: %s [%d%%]" %
                       (self.url().host(), progress))

    def _onCookieAdded(self, cookie):
        cookie_str = str(cookie.toRawForm(QNetworkCookie.NameAndValueOnly),
                         encoding='utf-8')
        cookie_name = str(cookie.name(), encoding='utf-8')
        cookie_val = str(cookie.value(), encoding='utf-8')
        if (cookie_name
                == self.authn_cookie_name) and (cookie.domain()
                                                == self.config.get("host")):
            logging.trace("%s cookie added:\n\n%s\n\n" %
                          (self.authn_cookie_name, cookie_str))
            self.credential["cookie"] = "%s=%s" % (self.authn_cookie_name,
                                                   cookie_val)
            host = self.auth_url.host()
            cred_entry = dict()
            cred_entry[host] = self.credential
            if self.credential_file:
                creds = read_credential(self.credential_file,
                                        create_default=True)
                creds.update(cred_entry)
                write_credential(self.credential_file, creds)
            self.token = cookie_val
            self._session.cookies.set(self.authn_cookie_name,
                                      cookie_val,
                                      domain=host,
                                      path='/')
            self.authn_session_page.setUrl(
                QUrl(self.auth_url.toString() + "/authn/session"))

    def _onCookieRemoved(self, cookie):
        cookie_str = str(cookie.toRawForm(QNetworkCookie.NameAndValueOnly),
                         encoding='utf-8')
        cookie_name = str(cookie.name(), encoding='utf-8')
        if cookie_name == self.authn_cookie_name and cookie.domain(
        ) == self.url().host():
            logging.trace("%s cookie removed:\n\n%s\n\n" %
                          (self.authn_cookie_name, cookie_str))

    def _cleanup(self):
        self._timer.stop()
        self.token = None
        self.authn_session = None
        self.authn_expires = time.time()
        if self.authn_session_page:
            self.authn_session_page.loadProgress.disconnect(
                self._onLoadProgress)
            self.authn_session_page.loadFinished.disconnect(
                self._onLoadFinished)
            self.authn_session_page.profile().cookieStore(
            ).cookieAdded.disconnect(self._onCookieAdded)
            self.authn_session_page.profile().cookieStore(
            ).cookieRemoved.disconnect(self._onCookieRemoved)
            del self.authn_session_page
コード例 #6
0
 def title(self):
     if self.__delay_loading_url:
         return self.__delay_loading_url.title
     return QWebEnginePage.title(self)
コード例 #7
0
    def createWindow(self, t):
        fake_page = QWebEnginePage(self)
        fake_page.urlChanged.connect(
            lambda url: self.__create_window_request(fake_page, url))

        return fake_page
コード例 #8
0
    def test_qt(self):
        from PyQt5.QtCore import QTimer
        from PyQt5.QtWidgets import QApplication
        from PyQt5.QtWebEngineWidgets import QWebEnginePage
        from PyQt5.QtGui import QImageReader, QFontDatabase
        from PyQt5.QtNetwork import QNetworkAccessManager
        from calibre.utils.img import image_from_data, image_to_data, test
        # Ensure that images can be read before QApplication is constructed.
        # Note that this requires QCoreApplication.libraryPaths() to return the
        # path to the Qt plugins which it always does in the frozen build,
        # because Qt is patched to know the layout of the calibre application
        # package. On non-frozen builds, it should just work because the
        # hard-coded paths of the Qt installation should work. If they do not,
        # then it is a distro problem.
        fmts = set(
            map(lambda x: x.data().decode('utf-8'),
                QImageReader.supportedImageFormats()))  # no2to3
        testf = {'jpg', 'png', 'svg', 'ico', 'gif'}
        self.assertEqual(
            testf.intersection(fmts), testf,
            "Qt doesn't seem to be able to load some of its image plugins. Available plugins: %s"
            % fmts)
        data = P('images/blank.png', allow_user_override=False, data=True)
        img = image_from_data(data)
        image_from_data(
            P('catalog/mastheadImage.gif',
              allow_user_override=False,
              data=True))
        for fmt in 'png bmp jpeg'.split():
            d = image_to_data(img, fmt=fmt)
            image_from_data(d)
        # Run the imaging tests
        test()

        from calibre.gui2 import ensure_app, destroy_app
        display_env_var = os.environ.pop('DISPLAY', None)
        try:
            ensure_app()
            self.assertGreaterEqual(
                len(QFontDatabase().families()), 5,
                'The QPA headless plugin is not able to locate enough system fonts via fontconfig'
            )
            from calibre.ebooks.covers import create_cover
            create_cover('xxx', ['yyy'])
            na = QNetworkAccessManager()
            self.assertTrue(hasattr(na, 'sslErrors'),
                            'Qt not compiled with openssl')
            if iswindows:
                from PyQt5.Qt import QtWin
                QtWin
            p = QWebEnginePage()

            def callback(result):
                callback.result = result
                if hasattr(print_callback, 'result'):
                    QApplication.instance().quit()

            def print_callback(result):
                print_callback.result = result
                if hasattr(callback, 'result'):
                    QApplication.instance().quit()

            p.runJavaScript('1 + 1', callback)
            p.printToPdf(print_callback)
            QTimer.singleShot(5000, lambda: QApplication.instance().quit())
            QApplication.instance().exec_()
            test_flaky = ismacos and not is_ci
            if not test_flaky:
                self.assertEqual(callback.result, 2,
                                 'Simple JS computation failed')
                self.assertIn(b'Skia/PDF', bytes(print_callback.result),
                              'Print to PDF failed')
            del p
            del na
            destroy_app()
            del QWebEnginePage
        finally:
            if display_env_var is not None:
                os.environ['DISPLAY'] = display_env_var
コード例 #9
0
from qutebrowser.config import config
from qutebrowser.utils import log, debug, usertypes

_QB_FILESELECTION_MODES = {
    QWebEnginePage.FileSelectOpen:
    shared.FileSelectionMode.single_file,
    QWebEnginePage.FileSelectOpenMultiple:
    shared.FileSelectionMode.multiple_files,
    # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-91489
    #
    # QtWebEngine doesn't expose this value from its internal
    # FilePickerControllerPrivate::FileChooserMode enum (i.e. it's not included in
    # the public QWebEnginePage::FileSelectionMode enum).
    # However, QWebEnginePage::chooseFiles is still called with the matching value
    # (2) when a file input with "webkitdirectory" is used.
    QWebEnginePage.FileSelectionMode(2):
    shared.FileSelectionMode.folder,
}


class WebEngineView(QWebEngineView):
    """Custom QWebEngineView subclass with qutebrowser-specific features."""
    def __init__(self, *, tabdata, win_id, private, parent=None):
        super().__init__(parent)
        self._win_id = win_id
        self._tabdata = tabdata

        theme_color = self.style().standardPalette().color(QPalette.Base)
        if private:
            assert webenginesettings.private_profile is not None
            profile = webenginesettings.private_profile
コード例 #10
0
 def __init__(self, url):
     QWebEnginePage.__init__(self)
     self.html = ''
     self.loadFinished.connect(self._on_load_finished)
     self.load(QUrl(url))
     self.app.exec_()
コード例 #11
0
ファイル: main.py プロジェクト: dada0920/Umbrella
class TestForm(QMainWindow, Ui_MainWindow):
    #생성자
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # 초기화
        self.url = QUrl("http://localhost:8080/umbrella")
        self.webEngineView.load(QUrl(self.url))
        self.page = QWebEnginePage()
        self.page.setUrl(self.url)
        self.page.setView(self.webEngineView)

        self.comboBox.addItem("키워드")
        self.comboBox.addItem("주소")

        # self.page.featurePermissionRequested.connect(self.setPagePermission)

        self.pushButton.clicked.connect(self.search)
        self.lineEdit.returnPressed.connect(self.search)
        self.init_my_location()
        self.page.loadFinished.connect(
            lambda: self.setMap(self.my_location_lat, self.my_location_lng))
        # self.setMap(self.my_location_lat, self.my_location_lng)

    #아이피로 현재 위치 받아오기(google api 사용)
    def init_my_location(self):
        url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyDQKxbTt0MrFNH85kTJXzickMD5s88UVaI'
        data = {
            'considerIp': True,
        }

        result = requests.post(url, data)

        my_location = json.loads(result.text)
        # print(my_location)
        print("lat : ", my_location.get('location').get('lat'))
        print("lon : ", my_location.get('location').get('lng'))
        self.my_location_lat = my_location.get('location').get('lat')
        self.my_location_lng = my_location.get('location').get('lng')

    def setMap(self, lat, lng):
        script = """
        var umbrella_location = new kakao.maps.LatLng(""" + str(
            lat) + """, """ + str(lng) + """);
        map.setCenter(umbrella_location);
        """
        self.run(script)

    #위치권한 요청이 왔을때 허용해줌
    def setPagePermission(self, url, feature):
        self.page.setFeaturePermission(url, feature,
                                       QWebEnginePage.PermissionGrantedByUser)

    def search(self):

        search_text = self.lineEdit.text().strip()

        if self.comboBox.currentIndex() == 0:
            script = """
            removeMarkers();
            // 주소-좌표 변환 객체를 생성합니다
            var geocoder = new kakao.maps.services.Geocoder();

            // 장소 검색 객체를 생성합니다
            var ps = new kakao.maps.services.Places();

            // 키워드로 장소를 검색합니다
            ps.keywordSearch('""" + search_text + """', placesSearchCB);

            function placesSearchCB (data, status, pagination) {
                if (status === kakao.maps.services.Status.OK) {

                    // 검색된 장소 위치를 기준으로 지도 범위를 재설정하기위해
                    // LatLngBounds 객체에 좌표를 추가합니다
                    var bounds = new kakao.maps.LatLngBounds();

                    for (var i=0; i<data.length; i++) {
                        displayMarker(data[i]);
                        bounds.extend(new kakao.maps.LatLng(data[i].y, data[i].x));
                    }

                    // 검색된 장소 위치를 기준으로 지도 범위를 재설정합니다
                    map.setBounds(bounds);
                }
            }


            """
        elif self.comboBox.currentIndex():
            script = """

            removeMarkers();
            var positions = [];
            positions=Marker3.main3();
            for (var i=0; i<positions.length;i++){
                map:map,
                position:new kakao.maps.LatLng(positions[i].get('lat')+positions[i].get('lng'))
            }
            // 주소-좌표 변환 객체를 생성합니다
            var geocoder = new kakao.maps.services.Geocoder();

            // 주소로 좌표를 검색합니다
            geocoder.addressSearch('""" + search_text + """', function(result, status) {

                // 정상적으로 검색이 완료됐으면
                 if (status === kakao.maps.services.Status.OK) {

                    var coords = new kakao.maps.LatLng(result[0].y, result[0].x);

                    // 결과값으로 받은 위치를 마커로 표시합니다
                    var marker = new kakao.maps.Marker({
                        map: map,
                        position: coords
                    });



                    //*** 마커 담기
                    markerList.push(marker)


                    // 인포윈도우로 장소에 대한 설명을 표시합니다

                    infowindow.open(map, marker);

                    // 지도의 중심을 결과값으로 받은 위치로 이동시킵니다
                    map.setCenter(coords);
                }
            });    """

        else:

            return

        self.run(script)

    def run(self, script):
        self.page.runJavaScript(script)
コード例 #12
0
logging_kwargs = {}
if args.logfile != "":
    logging_kwargs["filename"] = args.logfile
    logging.basicConfig(level=getattr(logging, args.logLevel), **logging_kwargs)
log.debug("starting subprocess")

log.debug("args: " + repr(args))

app = QApplication([])
browser = QWebEngineView()

if args.storage != "":
    log.debug("using storage " + args.storage)
    profile = QWebEngineProfile(args.storage, browser)
    webpage = QWebEnginePage(profile, browser)
    browser.setPage(webpage)

redirect_uri = args.redirect_uri

def parse_token(url_with_token):
    qsl = parse_qsl(url_with_token.split("#", 1)[1])
    token = {}

    for el in qsl:
        token[el[0]] = el[1]

    return token

def token_getter_url(**kwargs):
    return "https://oauth.vk.com/authorize?" + urlencode(kwargs)
コード例 #13
0
ファイル: om_webview.py プロジェクト: rowinggolfer/openmolar1
 def acceptNavigationRequest(self, url, type_, bool_):
     if self.delegate_links and type_ == self.NavigationTypeLinkClicked and url.url().startswith("om://"):
         LOGGER.debug("acceptNavigationRequest %s", url)
         self.parent().linkClicked.emit(url)
         return False
     return QWebEnginePage.acceptNavigationRequest(self, url, type_, bool_)
コード例 #14
0
class Browser(QMainWindow):
    def __init__(self, mainWin, webview=None):
        super().__init__(mainWin)
        self.showFullScreen()
        self.mainWin = mainWin
        self.webview = webview
        self.initUI()

    def initUI(self):
        global CREATE_BROWER
        # print("initUI")
        # self.setWindowFlags(Qt.FramelessWindowHint)  # 去掉标题栏的代码
        # 设置窗口标题
        # self.setWindowTitle('LingBrowser')
        # 设置窗口图标
        self.setWindowIcon(QIcon(':/icons/logo.png'))
        self.page = QWebEnginePage()
        self.page.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)  # 支持视频播放
        self.page.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)
        self.page.settings().setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
        if self.webview == None:
            # 初始化一个 tab
            self.webview = WebView(self)  # self必须要有,是将主窗口作为参数,传给浏览器
            self.page.setUrl(QUrl(HOME_PAGE))
        self.page.windowCloseRequested.connect(self.on_windowCloseRequested)  # 页面关闭请求
        if CREATE_BROWER:
            CREATE_BROWER = False
            self.page.profile().downloadRequested.connect(self.on_downloadRequested)  # 页面下载请求

        self.t = WebEngineUrlRequestInterceptor()
        self.page.profile().setRequestInterceptor(self.t)
        self.webview.setPage(self.page)
        self.url = self.webview.page().url()
        self.initToolbar(self.webview)
        self.setCentralWidget(self.webview)
        self.center()

    def on_downloadRequested(self, downloadItem):
        # print("download..")
        # print(downloadItem.downloadFileName())
        # print('isFinished', downloadItem.isFinished())
        # print('isPaused', downloadItem.isPaused())
        # print('isSavePageDownload', downloadItem.isSavePageDownload())
        # print('path', downloadItem.path())
        # print('url', downloadItem.url())
        downloadFileName, ok2 = QFileDialog.getSaveFileName(self,
                                                            "文件保存",
                                                            downloadItem.path(),
                                                            "All Files (*)")
        print(downloadItem.path())
        downloadItem.setPath(downloadFileName)
        downloadItem.accept()
        downloadItem.finished.connect(self.on_downloadfinished)
        downloadItem.downloadProgress.connect(self.on_downloadProgress)

    def on_downloadfinished(self):
        print()

    def on_downloadProgress(self, int_1, int_2):
        rate = str(round(int_1 / int_2, 2) * 100).split(".")[0]
        self.mainWin.statusBarDownloadLabel.setText("文件下载 " + rate + "%")
        if int(rate) == 100:
            self.mainWin.statusBarDownloadLabel.setHidden(True)
            self.mainWin.statusBar.setHidden(True)
        else:
            self.mainWin.statusBarDownloadLabel.setHidden(False)
            self.mainWin.statusBar.setHidden(False)

    def on_windowCloseRequested(self):
        print("close tab")
        # self.webview.close()
        # del self.webview
        # sip.delete(self.webview)
        # self.webview
        # self.webview.page().profile().deleteLater()
        # self.deleteLater()
        pass

    def moreMenuShow(self):
        try:
            self.contextMenu = QMenu()
            self.contextMenu.setObjectName("moreMenu")
            self.contextMenu.setFont(fontawesome("far"))
            # self.actionA = self.contextMenu.addAction(self.zoom_in_action)
            # self.actionA = self.contextMenu.addAction(self.zoom_out_action)
            self.contextMenu.popup(
                QPoint(self.mainWin.x() + self.more_button.x() - 200, self.mainWin.y() + 75))  # 2菜单显示的位置 QCursor.pos()
            # print(self.more_button.x())
            # print(self.more_button.y())
            # print(self.frameGeometry())
            # print(self.mainWin.x())
            # print(self.mainWin.y())
            self.contextMenu.setContentsMargins(25,0,0,0)
            self.contextMenu.addMenu("打印")
            self.contextMenu.addSeparator()
            # 缩放组合
            sf_widget = QWidget(self)
            sf_widget.setProperty("class","qwidget")
            sf_widget.setObjectName("sf_widget")
            sf_widget.setContentsMargins(0,0,0,0)
            # sf_widget.setFixedHeight(20)
            sf_layout = QHBoxLayout()
            sf_layout.setContentsMargins(0,0,0,0)
            sf_widget.setLayout(sf_layout)
            sf_label = QLabel("缩放")
            sf_label.setObjectName("sf_item_label")
            sf_layout.addWidget(sf_label)
            sf_layout.addWidget(self.zoom_out_button)
            sf_layout.addWidget(self.sf_label_rate)
            sf_layout.addWidget(self.zoom_in_button)
            sf_layout.addWidget(self.full_screen_button)
            sf_action = QWidgetAction(self)
            sf_action.setDefaultWidget(sf_widget)
            self.actionA = self.contextMenu.addAction(sf_action)
            # self.actionA.triggered.connect(self.actionHandler)
            sf_layout.setSpacing(0)

            self.contextMenu.show()
        except Exception as e:
            print(e)

    def initToolbar(self, webview):
        pass
        ###使用QToolBar创建导航栏,并使用QAction创建按钮
        # 添加导航栏
        self.navigation_bar = QToolBar('Navigation')
        # 锁定导航栏
        self.navigation_bar.setMovable(False)
        # 设定图标的大小
        self.navigation_bar.setIconSize(QSize(2, 2))
        # 添加导航栏到窗口中
        self.addToolBar(self.navigation_bar)
        # 添加其它配置
        self.navigation_bar.setObjectName("navigation_bar")
        self.navigation_bar.setCursor(Qt.ArrowCursor)
        # QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中
        # 添加前进、后退、停止加载和刷新的按钮
        self.reload_icon = unichr(0xf2f9)
        self.stop_icon = unichr(0xf00d)

        # 后退按钮
        self.back_action = QWidgetAction(self)
        self.back_button = QPushButton(unichr(0xf060), self,
                                       clicked=webview.back,
                                       font=fontawesome("far"),
                                       objectName='back_button')
        self.back_button.setToolTip("后退")
        self.back_button.setCursor(Qt.ArrowCursor)
        self.back_action.setDefaultWidget(self.back_button)

        # 前进按钮
        self.next_action = QWidgetAction(self)
        self.next_button = QPushButton(unichr(0xf061), self,
                                       clicked=webview.forward,
                                       font=fontawesome("far"),
                                       objectName='next_button')
        self.next_button.setToolTip("前进")
        self.next_button.setCursor(Qt.ArrowCursor)
        self.next_action.setDefaultWidget(self.next_button)

        # 刷新与停止按钮
        self.reload_action = QWidgetAction(self)

        self.reload_button = QPushButton(self.reload_icon, self,
                                         clicked=webview.reload,
                                         font=fontawesome("far"),
                                         objectName='reload_button')
        self.reload_button.setToolTip("刷新")
        self.reload_button.setCursor(Qt.ArrowCursor)
        self.reload_action.setDefaultWidget(self.reload_button)

        # 放大按钮
        self.zoom_in_button = QPushButton(unichr(0xf067), self,
                                          clicked=self.zoom_in_func,
                                          font=fontawesome("far"),
                                          objectName='zoom_in_btn')
        self.zoom_in_button.setToolTip("放大")
        self.zoom_in_button.setCursor(Qt.ArrowCursor)

        # 缩小按钮
        self.zoom_out_button = QPushButton(unichr(0xf068), self,
                                           clicked=self.zoom_out_func,
                                           font=fontawesome("far"),
                                           objectName='zoom_out_btn')
        self.zoom_out_button.setToolTip("缩小")
        self.zoom_out_button.setCursor(Qt.ArrowCursor)
        self.sf_label_rate = QLabel()
        self.sf_label_rate.setObjectName("sf_label_rate")
        self.sf_label_rate.setFixedWidth(30)
        self.sf_label_rate.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter)
        self.sf_label_rate.setProperty("class","qlabel")
        self.sf_label_rate.setText(str(int(self.webview.zoomFactor()*100))+"%")

        # 全屏按钮
        self.full_screen_button = QPushButton(unichr(0xe140), self,
                                           clicked=self.full_screen_func,
                                           font=fontawesome("boot"),
                                           objectName='full_screen_button')
        self.full_screen_button.setToolTip("全屏")
        self.full_screen_button.setCursor(Qt.ArrowCursor)

        # 其它按钮
        self.more_action = QWidgetAction(self)
        self.more_button = QPushButton(unichr(0xe235), self,
                                       clicked=self.moreMenuShow,
                                       font=fontawesome("boot"),
                                       objectName='more_button')
        self.more_button.setToolTip("页面控制及浏览器核心")
        self.more_button.setCursor(Qt.ArrowCursor)
        self.more_action.setDefaultWidget(self.more_button)

        # 首页按钮
        self.index_action = QWidgetAction(self)
        self.index_button = QPushButton(unichr(0xf015), self,
                                        # clicked=self.zoom_out_func,
                                        font=fontawesome("far"),
                                        objectName='index_button')
        self.index_button.setToolTip("主页")
        self.index_button.setCursor(Qt.ArrowCursor)
        self.index_action.setDefaultWidget(self.index_button)

        # self.back_button.triggered.connect(webview.back)
        # self.next_button.triggered.connect(webview.forward)
        # self.reload_button.triggered.connect(webview.reload)
        # self.zoom_in_btn.triggered.connect(self.zoom_in_func)
        # self.zoom_out_btn.triggered.connect(self.zoom_out_func)
        # 将按钮添加到导航栏上
        self.navigation_bar.addAction(self.back_action)
        self.navigation_bar.addAction(self.next_action)
        self.navigation_bar.addAction(self.reload_action)
        self.navigation_bar.addAction(self.index_action)
        # 添加URL地址栏
        self.urlbar = QLineEdit()
        # 让地址栏能响应回车按键信号
        self.urlbar.returnPressed.connect(self.navigate_to_url)
        # self.navigation_bar.addSeparator()
        self.navigation_bar.addWidget(self.urlbar)
        # self.navigation_bar.addSeparator()

        # self.navigation_bar.addAction(self.zoom_in_action)
        # self.navigation_bar.addAction(self.zoom_out_action)
        self.navigation_bar.addAction(self.more_action)
        # 让浏览器相应url地址的变化
        webview.urlChanged.connect(self.renew_urlbar)
        webview.loadProgress.connect(self.processLoad)
        webview.loadStarted.connect(self.loadPage)
        webview.loadFinished.connect(self.loadFinish)
        webview.titleChanged.connect(self.renew_title)
        webview.iconChanged.connect(self.renew_icon)
        self.webBind()
        webview.show()
        self.navigation_bar.setIconSize(QSize(20, 20))
        self.urlbar.setFont(QFont('SansSerif', 13))

    def zoom_in_func(self):
        self.webview.setZoomFactor(self.webview.zoomFactor() + 0.1)
        self.sf_label_rate.setText(str(int(self.webview.zoomFactor()*100))+"%")

    def zoom_out_func(self):
        self.webview.setZoomFactor(self.webview.zoomFactor() - 0.1)
        self.sf_label_rate.setText(str(int(self.webview.zoomFactor()*100))+"%")

    def full_screen_func(self):
        self.navigation_bar.setHidden(True)
        self.mainWin.titleBar.setHidden(True)
        self.mainWin.showFullScreen()

    def on_network_call(self, info):
        print(info)
        pass

    def loadPage(self):
        # print("loadPage")
        # print(self.webview.objectName())
        # self.renew_title("空页面")
        index = self.mainWin.tabWidget.currentIndex()
        self.mainWin.tabWidget.setTabIcon(index, QIcon(":icons/earth_128.png"))
        # self.reload_button.setDefaultWidget(self.stop_button_icon)
        self.reload_button.setText(self.stop_icon)
        self.reload_button.setToolTip("停止")

    def processLoad(self, rate):
        self.mainWin.statusBarLabelProgress.setValue(rate)
        self.mainWin.statusBarLabel.setText("网页加载")
        if rate == 0:
            self.mainWin.statusBarLabelProgress.setMaximum(0)
            self.mainWin.statusBarLabelProgress.setMinimum(0)
        else:
            self.mainWin.statusBarLabelProgress.setMaximum(0)
            self.mainWin.statusBarLabelProgress.setMinimum(100)
        if rate == 100:
            self.mainWin.statusBarLabelProgress.setHidden(True)
            self.mainWin.statusBarLabel.setHidden(True)
            self.mainWin.statusBar.setHidden(True)
        else:
            self.mainWin.statusBarLabelProgress.setHidden(False)
            self.mainWin.statusBarLabel.setHidden(False)
            self.mainWin.statusBar.setHidden(False)
        pass

    def loadFinish(self, isEnd):
        if isEnd:
            # print("load finished", isEnd)
            # self.reload_button.setDefaultWidget(self.reload_button_icon)
            self.reload_button.setText(self.reload_icon)
            self.reload_button.setToolTip("刷新")
        else:
            # print("load finished", isEnd)
            # print("load finished",isEnd)
            pass
        # index = self.webview.objectName()
        # title = self.page.title()
        # print("title", title)
        try:
            url = self.page.url().toString()
        except BaseException as base:
            url = self.webview.page().url().toString()
        # self.mainWin.tabWidget.setTabText(int(index), title if title else url)
        self.urlbar.setText(url)

    def webBind(self):
        # print("webBind")
        # self.back_button.disconnect()
        # self.next_button.disconnect()
        # self.stop_button.disconnect()
        # self.reload_button.disconnect()
        # self.add_button.disconnect()
        # self.back_button.triggered.connect(self.webview.back)
        # self.next_button.triggered.connect(self.webview.forward)
        # self.stop_button.triggered.connect(self.webview.stop)
        # self.reload_button.triggered.connect(self.webview.reload)
        # self.add_button.triggered.connect(self.mainWin.newTab)
        self.webview.urlChanged.connect(self.renew_urlbar)
        self.webview.titleChanged.connect(self.renew_title)
        self.webview.iconChanged.connect(self.renew_icon)

    def navigate_to_url(self):
        q = QUrl(self.urlbar.text())
        if q.scheme() == '':
            q.setScheme('http')
        self.webview.setUrl(q)

    def renew_urlbar(self, url):
        # 将当前网页的链接更新到地址栏
        # print("renew_urlbar")
        self.urlbar.setText(url.toString())
        self.urlbar.setCursorPosition(0)
        # print("url", url)f

    def renew_title(self, title):
        # 将当前网页的标题更新到标签栏
        index = self.webview.objectName()
        self.mainWin.tabWidget.setTabToolTip(int(index), title)
        title = " " + title[:11] + ".." if len(title) >= 12 else " " + title
        self.mainWin.tabWidget.setTabText(int(index), title)
        pass

    def renew_icon(self, icon):
        # 将当前网页的图标更新到标签栏
        # print("renew_icon")
        index = self.webview.objectName()
        self.mainWin.tabWidget.setTabIcon(int(index), icon)

    def center(self):
        # print("center")
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    # 创建tab
    def create_tab(self, webview):
        # print("create_tab")
        self.tab = QWidget()
        self.mainWin.tabWidget.addTab(self.tab, "新标签页")
        self.mainWin.tabWidget.setCurrentWidget(self.tab)
        index = self.mainWin.tabWidget.currentIndex()
        # self.mainWin.tabWidget.setTabIcon(index, ":icons/logo.png")
        #####
        self.Layout = QVBoxLayout(self.tab)
        self.Layout.setContentsMargins(0, 0, 0, 0)
        self.Layout.addWidget(Browser(self.mainWin, webview=webview))
        webview.setObjectName(str(index))
        self.mainWin.tab_[str(index)] = webview
        self.tab.setObjectName("tab_" + str(index))
コード例 #15
0
ファイル: webenginepreview.py プロジェクト: visaul/retext
 def __init__(self, parent, tab):
     QWebEnginePage.__init__(self, parent)
     self.tab = tab
コード例 #16
0
ファイル: appqt5webengine.py プロジェクト: AlexxNica/kp-lens
 def __init__(self, debug=False):
     QWebEnginePage.__init__(self)
コード例 #17
0
    def __init__(self, *args, **kwargs):

        QWebEnginePage.__init__(self, *args, **kwargs)
        self.featurePermissionRequested.connect(
            self.onFeaturePermissionRequested)
コード例 #18
0
 def __init__(self, debug=False):
     QWebEnginePage.__init__(self)
コード例 #19
0
 def __init__(self, parent, cp750bridge, args):
     QWebEnginePage.__init__(self, parent)
     self.args = args
     channel = QWebChannel(self)
     self.setWebChannel(channel)
     channel.registerObject("cp750bridge", cp750bridge)
コード例 #20
0
class Umbrella(QMainWindow, Ui_MainWindow):
    #생성자
    def __init__(self):
        super().__init__()
        self.init_my_location()
        self.setupUi(self)  # 초기화
        self.url = "http://localhost:8080/umbrella"
        # self.url = "http://localhost:8000/umbrella2.html"
        self.webEngineView.load(QUrl(self.url))
        self.page = QWebEnginePage()
        self.page.setUrl(QUrl(self.url))
        self.page.setView(self.webEngineView)
        self.appLoaded = False
        chrome_option = Options()
        chrome_option.add_argument("--headless")
        chrome_option.add_argument("--mute-audio")
        self.browser = webdriver.Chrome(
            chrome_options=chrome_option,
            executable_path="resources/chromedriver.exe")
        self.browser.get(self.url)
        self.user_uuid = uuid.uuid4()
        self.runner = Runner(self)
        self.dc = DataCollector(self)
        # self.comboBox.addItem("키워드")
        # self.comboBox.addItem("주소")
        self.itemList = []
        self.rowList = []

        #page 변환
        self.pushButton_3.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton__image.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))
        self.pushButton.clicked.connect(self.runner.map_removeMarkers)
        #intro 데이터 입력
        self.lineEdit.returnPressed.connect(
            lambda: self.runner.search(self.lineEdit.text().strip()))
        self.pushButton.clicked.connect(
            lambda: self.runner.search(self.lineEdit.text().strip()))
        self.page.loadFinished.connect(lambda: self.runner.setMap(
            self.my_location_lat, self.my_location_lng))
        # self.setMap(self.my_location_lat, self.my_location_lng)

        self.pushButton2.clicked.connect(self.mark_around)
        self.pushButton3.clicked.connect(lambda: self.runner.setMap(
            self.my_location_lat, self.my_location_lng))
        self.page.urlChanged.connect(self.setButton)

        self.listWidget.itemActivated.connect(self.activateRow)
        # self.lineEdit.setText(self.runner.coord_to_address(self.my_location_lat,self.my_location_lng, 0))
        self.lineEdit.setText(
            self.runner.coord_to_address(self.my_location_lat,
                                         self.my_location_lng, 0))

    def mark_around(self):
        self.remove_list()
        if not self.page.url().toString().strip().startswith(
                "http://localhost:8080/umbrella"):
            self.page.load(QUrl(self.url))
            return
        self.runner.map_removeMarkers()
        lat, lng = self.runner.map_getCenter()
        data = self.dc.get_data_by_latlng(lat, lng, 1000)
        self.runner.marking(data)
        self.show_list(data)
        self.lineEdit.setText(self.runner.coord_to_address(lat, lng, 0))
        print("uuid---------------------------------", self.user_uuid)

    # def checkBox_mark_around(self):

    #표지
    def intro(self):
        #Text
        self.dc.show_intro_list()
        #그래프
        self.dc.intro_graph()

    def init_my_location(self):
        url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyDQKxbTt0MrFNH85kTJXzickMD5s88UVaI'
        data = {
            'considerIp': True,
        }

        result = requests.post(url, data)

        my_location = json.loads(result.text)
        # print(my_location)
        # print("lat : ",my_location.get('location').get('lat'))
        # print("lon : ",my_location.get('location').get('lng'))
        self.my_location_lat = str(my_location.get('location').get('lat'))
        self.my_location_lng = str(my_location.get('location').get('lng'))

    def setButton(self):
        if self.page.url().toString().strip().startswith(
                "http://localhost:8080/umbrella"):
            self.pushButton2.setText("판매처 탐색")
        else:
            self.pushButton2.setText("지도 새로고침")

    def show_list(self, data):
        for i in range(len(data)):
            item = QListWidgetItem(self.listWidget)
            row = Item(data[i])
            item.setWhatsThis(str(i))
            item.setSizeHint(row.sizeHint())
            self.listWidget.setItemWidget(item, row)
            self.listWidget.addItem(item)
            self.itemList.append(item)
            self.rowList.append(row)

    def remove_list(self):
        for i in range(len(self.itemList)):
            self.itemList[i].setHidden(True)
        self.itemList = []
        self.rowList = []

    def activateRow(self, row):
        self.runner.setMap(self.rowList[int(row.whatsThis())].lat,
                           self.rowList[int(row.whatsThis())].lng)
        self.runner.info_open(self.rowList[int(row.whatsThis())].code)
コード例 #21
0
 def acceptNavigationRequest(self, url, _type, isMainFrame):
     #print("acceptNavigationRequest")
     # print(url)
     return QWebEnginePage.acceptNavigationRequest(self, url, _type,
                                                   isMainFrame)
コード例 #22
0
 def __init__(self, url):
     self.app = QApplication(sys.argv)
     QWebPage.__init__(self)
     self.loadFinished.connect(self.on_page_load)
     self.load(QUrl(url))
     self.app.exec_()
コード例 #23
0
class POSM(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setLocale(QLocale(QLocale.English))
        self.initUI()
        self.setAttribute(Qt.WA_AlwaysShowToolTips)
        sizegrip = QtWidgets.QSizeGrip(self)
        self.layout.addWidget(sizegrip, 0,
                              QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight)

        self.record = [None]
        recordAction = QAction(datetime.datetime.now().strftime('%H:%M:%S'),
                               self)
        recordAction.triggered.connect(lambda: self.changeMap(0))
        self.recordMenu.addAction(recordAction)

    def initUI(self):
        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.console = InformationalConsole(app)

        self.horSplitter = QSplitter(Qt.Horizontal)
        self.horSplitter.setChildrenCollapsible(False)
        self.editionSplitter = QSplitter(Qt.Vertical)
        self.editionSplitter.setChildrenCollapsible(False)

        self.queryUI = QueryUI()
        self.queryUI.setOnRequestChanged(self.changeCurrentMap)
        self.editionSplitter.addWidget(self.queryUI)

        self.queryWidget = QWidget()
        self.queryWidget.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Maximum)
        self.queryWidget.setLayout(QVBoxLayout())
        self.queryWidget.layout().setContentsMargins(0, 0, 0, 0)
        self.queryWidget.layout().setSpacing(0)

        self.queryHeader = QLabel("Query")
        self.queryHeader.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Fixed)
        self.queryHeader.setFixedHeight(self.queryHeader.sizeHint().height() +
                                        10)
        self.queryHeader.setContentsMargins(5, 5, 0, 5)
        self.queryWidget.layout().addWidget(self.queryHeader)

        self.queryText = CodeEditor()
        self.qlHighlighter = OverpassQLHighlighter(self.queryText.document())
        self.queryText.setReadOnly(True)
        self.queryWidget.layout().addWidget(self.queryText)

        self.editionSplitter.addWidget(self.queryWidget)

        self.horSplitter.addWidget(self.editionSplitter)

        self.emptyMapPage = QWebEnginePage()
        self.emptyMapPage.setHtml(EMPTY_HTML)

        self.manualModePage = QWebEnginePage()
        soup = bs4.BeautifulSoup(EMPTY_HTML, features="html.parser")
        js = soup.new_tag("script")
        js.string = (MANUAL_MODE_JS_SCRIPT % (str([])))
        soup.append(js)

        self.manualModePage.setHtml(str(soup))

        self.mapRenderer = QWebEngineView()
        self.mapRenderer.setMinimumWidth(500)
        self.mapRenderer.setPage(self.emptyMapPage)

        self.consoleSplitter = QSplitter(Qt.Vertical)
        self.consoleSplitter.setChildrenCollapsible(False)
        self.consoleSplitter.addWidget(self.mapRenderer)

        self.consoleWidget = QWidget()
        self.consoleWidget.setLayout(QVBoxLayout())
        self.consoleWidget.layout().setContentsMargins(0, 0, 0, 0)
        self.consoleWidget.layout().setSpacing(0)

        self.consoleHeader = QLabel("Console")
        self.consoleHeader.setSizePolicy(QSizePolicy.Expanding,
                                         QSizePolicy.Fixed)
        self.consoleHeader.setContentsMargins(5, 5, 0, 5)
        self.consoleWidget.layout().addWidget(self.consoleHeader)
        self.consoleWidget.layout().addWidget(self.console)

        self.consoleSplitter.addWidget(self.consoleWidget)

        self.horSplitter.addWidget(self.consoleSplitter)

        self.layout.addWidget(self.horSplitter)

        self.initMenuBar()

        centralWidget = QWidget(self)
        centralWidget.setLayout(self.layout)
        self.setCentralWidget(centralWidget)

        self.setWindowTitle('Python Open Street Map')

    def initMenuBar(self):
        menubar = self.menuBar()

        fileMenu = menubar.addMenu('File')

        openAct = QAction('Open netedit', self)
        openAct.triggered.connect(self.openNet)
        fileMenu.addAction(openAct)

        saveMenu = fileMenu.addMenu("Save")

        saveOutputAct = QAction('output', self)
        saveOutputAct.triggered.connect(self.saveNet)
        saveOutputAct.setShortcut('Ctrl+S')
        saveMenu.addAction(saveOutputAct)

        saveQueryAct = QAction('query', self)
        saveQueryAct.triggered.connect(self.saveQuery)
        saveQueryAct.setShortcut('Ctrl+Shift+S')
        saveMenu.addAction(saveQueryAct)

        saveInteractiveModeAct = QAction('interactive mode', self)
        saveInteractiveModeAct.triggered.connect(self.saveInteractiveQuery)
        saveMenu.addAction(saveInteractiveModeAct)

        openMenu = fileMenu.addMenu("Open")

        openQuery = QAction('query', self)
        openQuery.triggered.connect(self.openQuery)
        openQuery.setShortcut('Ctrl+O')
        openMenu.addAction(openQuery)

        openInteractiveMode = QAction('interactive mode', self)
        openInteractiveMode.triggered.connect(self.openInteractiveQuery)
        openMenu.addAction(openInteractiveMode)

        self.recordMenu = openMenu.addMenu("record")

        runMenu = menubar.addMenu('Run')

        playAct = QAction('Play', self)
        playAct.triggered.connect(self.playQuery)
        playAct.setShortcut('Ctrl+P')
        runMenu.addAction(playAct)

        playTableRowAct = QAction('Play row selection', self)
        playTableRowAct.triggered.connect(self.playTableRow)
        playTableRowAct.setShortcut('Ctrl+T')
        runMenu.addAction(playTableRowAct)

        self.requestMenu = menubar.addMenu('Request')

        addRequestAct = QAction('Add request', self)
        addRequestAct.triggered.connect(lambda b: self.addRequest())
        addRequestAct.setShortcut('Ctrl+A')
        self.requestMenu.addAction(addRequestAct)

        templatesMenu = self.requestMenu.addMenu("Add template")

        addRoadAct = QAction('Roads', self)
        addRoadAct.triggered.connect(lambda: self.addTemplate([
            OverpassFilter("highway", TagComparison.EQUAL, "", False, True),
            OverpassFilter("name", TagComparison.EQUAL, "", False, True),
            OverpassFilter("ref", TagComparison.EQUAL, "", False, True),
            OverpassFilter("maxspeed", TagComparison.AT_MOST, "120", False,
                           False),
            OverpassFilter("lanes", TagComparison.EQUAL, "", False, True),
            OverpassFilter("oneway", TagComparison.EQUAL, "", False, True)
        ]))
        templatesMenu.addAction(addRoadAct)

        addMainRoadAct = QAction('Main roads', self)
        mainHighways = "^(motorway|trunk|primary|secondary|residential)(_link)?$"
        everythingButYes = "^(y(e([^s]|$|s.)|[^e]|$)|[^y]|$).*"
        addMainRoadAct.triggered.connect(lambda: self.addTemplate([
            OverpassFilter("highway", TagComparison.EQUAL, mainHighways, False,
                           False),
            OverpassFilter("construction", TagComparison.HAS_NOT_KEY, "",
                           False, False),
            OverpassFilter("noexit", TagComparison.EQUAL, "yes", True, True),
            OverpassFilter("access", TagComparison.EQUAL, everythingButYes,
                           True, False)
        ]))
        templatesMenu.addAction(addMainRoadAct)

        addParkingAct = QAction('Parking', self)
        addParkingAct.triggered.connect(lambda: self.addTemplate([
            OverpassFilter("service", TagComparison.EQUAL, "parking", False,
                           False),
            OverpassFilter("highway", TagComparison.HAS_KEY, "", False, True)
        ]))
        templatesMenu.addAction(addParkingAct)

        addPedestriansAct = QAction('Pedestrians', self)
        pedestrianHighway = [
            "pedestrian", "footway", "path", "cycleway", "bridleway", "steps",
            "crossing"
        ]
        addPedestriansAct.triggered.connect(lambda: self.addTemplate([
            OverpassFilter("highway", TagComparison.IS_ONE_OF,
                           pedestrianHighway, False, True)
        ]))
        templatesMenu.addAction(addPedestriansAct)

        removeRequestAct = QAction('Remove current request', self)
        removeRequestAct.triggered.connect(self.removeRequest)
        removeRequestAct.setShortcut('Ctrl+R')
        self.requestMenu.addAction(removeRequestAct)

        self.manualModeAct = QAction(
            'Switch between interactive and manual mode', self)
        self.manualModeAct.triggered.connect(self.switchManualMode)
        self.requestMenu.addAction(self.manualModeAct)

        self.manualModeMenu = menubar.addMenu('Manual mode')
        self.manualModeMenu.setEnabled(False)

        manualModeCleanPolygonAct = QAction('Clean polygon', self)
        manualModeCleanPolygonAct.triggered.connect(
            self.cleanManualModePolygon)
        self.manualModeMenu.addAction(manualModeCleanPolygonAct)

        manualModeGetPolygonAct = QAction('Polygon coordinates', self)
        manualModeGetPolygonAct.triggered.connect(
            lambda: self.manualModePage.runJavaScript(
                "getPolygons();", self.logManualModePolygonCoords))
        self.manualModeMenu.addAction(manualModeGetPolygonAct)

        windowsMenu = menubar.addMenu('Windows')

        cleanMapAct = QAction('Clean map', self)
        cleanMapAct.triggered.connect(self.cleanMap)
        windowsMenu.addAction(cleanMapAct)

        self.showHideInteractiveModeAct = QAction('Interactive mode', self)
        self.showHideInteractiveModeAct.triggered.connect(
            self.showHideInteractiveMode)
        windowsMenu.addAction(self.showHideInteractiveModeAct)

        showHideConsole = QAction('Console', self)
        showHideConsole.triggered.connect(self.showHideConsole)
        windowsMenu.addAction(showHideConsole)

        showHideQuery = QAction('Query', self)
        showHideQuery.triggered.connect(self.showHideQuery)
        windowsMenu.addAction(showHideQuery)

    # ACTIONS
    def cleanMap(self):
        if self.queryText.isReadOnly():
            if self.queryUI.getCurrentMap() is not None:
                self.mapRenderer.setPage(self.queryUI.updateMaps(EMPTY_HTML))
        else:
            soup = bs4.BeautifulSoup(EMPTY_HTML, features="html.parser")
            js = soup.new_tag("script")
            js.string = (MANUAL_MODE_JS_SCRIPT % (str([])))
            soup.append(js)
            self.manualModePage.setHtml(str(soup))

        logging.info("Cleaning map")

    def changeMap(self, i):
        if i == 0:
            if not self.queryText.isReadOnly():
                self.switchManualMode()
            if self.queryText.isReadOnly():
                self.queryUI.reset()
                self.queryText.clear()
                self.mapRenderer.setPage(self.emptyMapPage)
                self.queryUI.updateMaps(EMPTY_HTML)
        elif self.record[i]["interactiveMode"]:
            if not self.queryText.isReadOnly():
                self.switchManualMode()
            if self.queryText.isReadOnly():
                self.queryUI.setQuery(self.record[i]["query"])
                self.queryText.setPlainText(self.record[i]["query"].getQL())
                self.mapRenderer.setPage(
                    self.queryUI.updateMaps(self.record[i]["html"]))
        else:
            if self.queryText.isReadOnly():
                self.switchManualMode()
            if not self.queryText.isReadOnly():
                self.queryUI.reset()
                self.queryText.setPlainText(self.record[i]["query"])
                self.manualModePage.setHtml(self.record[i]["html"])
                self.mapRenderer.setPage(self.manualModePage)

    def logManualModePolygonCoords(self, coords):
        coordsString = " ".join([str(c) for point in coords for c in point])
        logging.info("Polygon coordinates:\"{}\"".format(coordsString))
        pyperclip.copy(coordsString)
        logging.debug("LINE")

    def cleanManualModePolygon(self):
        logging.info("Cleaning polygon.")
        self.manualModePage.runJavaScript(
            "cleanPolygon();", lambda returnValue: logging.debug("LINE"))

    def showHideInteractiveMode(self):
        if self.queryUI.isHidden():
            if self.editionSplitter.isHidden():
                self.editionSplitter.show()
                self.queryText.hide()
            self.queryUI.show()
            logging.info("Showing 'Interactive mode' window.")
        else:
            if self.queryText.isHidden():
                self.editionSplitter.hide()
            self.queryUI.hide()
            logging.info("Hiding 'Interactive mode' window.")
        logging.debug("LINE")

    def showHideConsole(self):
        if self.console.isHidden():
            self.console.show()
            logging.info("Showing 'Console' window.")
            self.consoleWidget.setMaximumHeight(QWIDGETSIZE_MAX)
        else:
            self.console.hide()
            self.consoleWidget.setMaximumHeight(
                self.queryHeader.sizeHint().height())
            logging.info("Hiding 'Console' window.")
        logging.debug("LINE")

    def showHideQuery(self):
        if self.queryText.isHidden():
            if self.editionSplitter.isHidden():
                self.editionSplitter.show()
                self.queryUI.hide()
            self.queryText.show()
            logging.info("Showing 'Query' window.")
            self.queryWidget.setMaximumHeight(QWIDGETSIZE_MAX)
        else:
            if self.queryUI.isHidden():
                self.editionSplitter.hide()
            self.queryText.hide()
            self.queryWidget.setMaximumHeight(
                self.queryHeader.sizeHint().height())
            logging.info("Hiding 'Query' window.")
        logging.debug("LINE")

    def switchManualMode(self):
        if self.queryText.isReadOnly():
            reply = QMessageBox.question(
                self, "Manual mode",
                "Are you sure?\nThe interactive mode will remain as it is now."
            )

            if reply == QMessageBox.Yes:
                self.queryText.setReadOnly(False)

                self.queryUI.hide()
                for action in self.requestMenu.actions():
                    action.setEnabled(False)
                self.manualModeAct.setEnabled(True)
                self.manualModeMenu.setEnabled(True)
                self.showHideInteractiveModeAct.setEnabled(False)
                self.mapRenderer.setPage(self.manualModePage)

                logging.info("Switching to manual mode.")
            else:
                logging.info(
                    "'Switch between interactive and manual mode' cancelled.")
        else:
            reply = QMessageBox.question(
                self, "Interactive mode",
                "Are you sure?\nThe current query will be removed.")

            if reply == QMessageBox.Yes:
                try:
                    self.queryText.clear()
                    self.queryText.setPlainText(
                        self.queryUI.getQuery().getQL())
                except BadFilterAttributes as e:
                    logging.error(str(e))
                except RuntimeError:
                    logging.warning("Failed to write query.")
                    self.queryText.clear()
                    self.queryText.setPlainText("")

                self.queryText.setReadOnly(True)

                self.queryUI.show()
                for action in self.requestMenu.actions():
                    action.setEnabled(True)
                self.manualModeMenu.setEnabled(False)
                self.showHideInteractiveModeAct.setEnabled(True)
                self.changeCurrentMap(0)

                logging.info("Switching to interactive mode.")
            else:
                logging.info(
                    "'Switch between interactive and manual mode' cancelled.")

        logging.info("Showing 'manual mode' polygon.")

    def addRequest(self, filters=None):
        self.queryUI.addRequestByFilters(filters)
        logging.info("Request added.")
        logging.debug("LINE")

    def addTemplate(self, filters):
        logging.info("Template applied.")
        self.queryUI.addRequestByFilters(filters)

    def removeRequest(self):
        reply = QMessageBox.question(
            self, "Remove current request",
            "Are you sure? This option is not undoable.")

        if reply == QMessageBox.Yes:
            self.queryUI.removeRequest()
            logging.info("'Remove request' successfully executed.")
        else:
            logging.info("'Remove request' cancelled.")
        logging.debug("LINE")

    def saveQuery(self):
        filename, selectedFilter = QFileDialog.getSaveFileName(
            self, 'Save query', expanduser("~/filename.txt"),
            "Text files (*.txt)")

        if filename != "":
            if self.queryText.isReadOnly():
                try:
                    query = self.queryUI.getQuery().getQL()
                    f = open(filename, "w+")
                    f.seek(0)
                    f.truncate()
                    f.write(query)
                    f.close()

                    logging.info("Query saved successfully.")
                except (RuntimeError, BadFilterAttributes) as e:
                    logging.error(str(e))
                except OSError:
                    logging.error(
                        "There was a problem creating the file with the query."
                    )
            else:
                try:
                    f = open(filename, "w+")
                    f.seek(0)
                    f.truncate()
                    f.write(self.queryText.toPlainText())
                    f.close()

                    logging.info("Query saved successfully.")
                except OSError:
                    logging.error(
                        "There was a problem creating the file with the query."
                    )
        else:
            logging.info("\"Save query\" canceled.")

        logging.debug("LINE")

    def openQuery(self):
        filename, selectedFilter = QFileDialog.getOpenFileName(
            self, 'Open query', expanduser("~/filename.txt"))

        if filename != "":
            try:
                if self.queryText.isReadOnly():
                    self.switchManualMode()

                f = open(filename, "r")
                self.queryText.clear()
                self.queryText.setPlainText(f.read())
                f.close()

                logging.info("File read successfully.")
            except UnicodeDecodeError:
                logging.error("The given file is not readable as text.")
            except OSError:
                logging.error("There was a problem opening the query file.")
        else:
            logging.info("\"Open query\" canceled.")

        logging.debug("LINE")

    def saveInteractiveQuery(self):
        filename, selectedFilter = QFileDialog.getSaveFileName(
            self, 'Save query', expanduser("~/filename.json"),
            "JSON files (*.json)")

        if filename != "":
            try:
                query = self.queryUI.getQuery()
                query.saveToFile(filename)
                logging.info("Query saved successfully.")
            except (RuntimeError, BadFilterAttributes) as e:
                logging.error(str(e))
            except OSError:
                logging.error(
                    "There was a problem creating the file with the query.")
        else:
            logging.info("\"Save query\" canceled.")

        logging.debug("LINE")

    def openInteractiveQuery(self):
        filename, selectedFilter = QFileDialog.getOpenFileName(
            self, 'Open query', expanduser("~/filename.json"))

        if filename != "":
            try:
                self.queryUI.setQuery(OverpassQuery.getFromFile(filename))

                if not self.queryText.isReadOnly():
                    self.switchManualMode()
            except json.decoder.JSONDecodeError:
                logging.error(
                    "The given file has not the right format (json). The file could not be opened."
                )
            except UnicodeDecodeError:
                logging.error(
                    "The given file is not readable as text. The file could not be opened."
                )
            except (TypeError, KeyError):
                logging.error(
                    "Fields are missing from the file or there are fields with the wrong data type. "
                    "The file could not be opened.")
            except OSError:
                logging.error(
                    "There was a problem opening the query file. The file could not be opened."
                )
        else:
            logging.info("\"Open query\" canceled.")

        logging.debug("LINE")

    def saveNet(self):
        filename, selectedFilter = QFileDialog.getSaveFileName(
            self, 'Save File', expanduser("~/filenameWithoutExtension"))
        if filename != "":
            buildNet(filename)
        else:
            logging.info("\"Save File\" canceled.")
        logging.debug("LINE")
        return filename

    def openNet(self):
        try:
            filename = self.saveNet()
            if filename == "":
                logging.error("Can't open NETEDIT without a file.")
            else:
                openNetedit(filename + ".net.xml")
                logging.info("Opening NETEDIT.")
                logging.warning(
                    "If NETEDIT is not open in ten seconds, there was an unhandled problem."
                )
                logging.debug("LINE")
        except OSError:
            logging.error("Can't find NETEDIT.")
        except Exception:
            logging.error(traceback.format_exc())

    # POLYGONS
    def changeCurrentMap(self, i):
        if self.queryUI.getCurrentMap() is None:
            self.mapRenderer.setPage(self.emptyMapPage)
        else:
            self.mapRenderer.setPage(self.queryUI.getCurrentMap())

    def playQuery(self):
        newRecord = {
            "interactiveMode": self.queryText.isReadOnly(),
            "query": self.queryText.toPlainText(),
            "html": ""
        }

        if self.queryText.isReadOnly():
            try:
                query = self.queryUI.getQuery()
                newRecord["query"] = query
                self.queryText.setPlainText(query.getQL())
            except (RuntimeError, BadFilterAttributes) as e:
                logging.error(str(e))
                return
        try:
            html = buildHTMLWithQuery(self.queryText.toPlainText())
            if self.queryText.isReadOnly():
                self.mapRenderer.setPage(self.queryUI.updateMaps(html))
                newRecord["html"] = html
            else:
                soup = bs4.BeautifulSoup(html, features="html.parser")
                js = soup.new_tag("script")
                js.string = (MANUAL_MODE_JS_SCRIPT % (str([])))
                soup.append(js)

                self.manualModePage.setHtml(str(soup))
                newRecord["html"] = str(soup)
                self.mapRenderer.setPage(self.manualModePage)
            logging.info("Query drawn.")
            logging.debug("LINE")
            self.addRecord(newRecord)
        except (OverpassRequestException, OsmnxException) as e:
            logging.error(str(e))
        except ox.EmptyOverpassResponse:
            logging.error("There are no elements with the given query.")
        except OSError:
            logging.error(
                "There was a problem creating the file with the request response."
            )
        except Exception:
            logging.error(traceback.format_exc())

    def addRecord(self, newRecord):
        self.record.append(newRecord)
        index = len(self.record) - 1

        recordAction = QAction(datetime.datetime.now().strftime('%H:%M:%S'),
                               self)
        recordAction.triggered.connect(lambda: self.changeMap(index))
        self.recordMenu.addAction(recordAction)

    def playTableRow(self):
        try:
            self.mapRenderer.setPage(self.queryUI.updateMapFromRow())
        except (OverpassRequestException, OsmnxException) as e:
            logging.error(str(e))
            logging.warning(
                "Before open NETEDIT you must run a query with the row filters applied."
            )
        except ox.EmptyOverpassResponse:
            logging.error("There are no elements with the given row.")
        except OSError:
            logging.error(
                "There was a problem creating the file with the row selection."
            )
        except RuntimeError as e:
            logging.error(str(e))
        except Exception:
            logging.error(traceback.format_exc())
        logging.debug("LINE")

    # EVENTS
    def closeEvent(self, event):
        for f in os.listdir(tempDir):
            os.remove(os.path.join(tempDir, f))
        QMainWindow.closeEvent(self, event)
コード例 #24
0
 def __init__(self):
     self._is_loaded = False
     self._motion_graph = None
     QWebEnginePage.__init__(self)
コード例 #25
0
    def initUI(self):
        self.layout = QHBoxLayout()
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.console = InformationalConsole(app)

        self.horSplitter = QSplitter(Qt.Horizontal)
        self.horSplitter.setChildrenCollapsible(False)
        self.editionSplitter = QSplitter(Qt.Vertical)
        self.editionSplitter.setChildrenCollapsible(False)

        self.queryUI = QueryUI()
        self.queryUI.setOnRequestChanged(self.changeCurrentMap)
        self.editionSplitter.addWidget(self.queryUI)

        self.queryWidget = QWidget()
        self.queryWidget.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Maximum)
        self.queryWidget.setLayout(QVBoxLayout())
        self.queryWidget.layout().setContentsMargins(0, 0, 0, 0)
        self.queryWidget.layout().setSpacing(0)

        self.queryHeader = QLabel("Query")
        self.queryHeader.setSizePolicy(QSizePolicy.Expanding,
                                       QSizePolicy.Fixed)
        self.queryHeader.setFixedHeight(self.queryHeader.sizeHint().height() +
                                        10)
        self.queryHeader.setContentsMargins(5, 5, 0, 5)
        self.queryWidget.layout().addWidget(self.queryHeader)

        self.queryText = CodeEditor()
        self.qlHighlighter = OverpassQLHighlighter(self.queryText.document())
        self.queryText.setReadOnly(True)
        self.queryWidget.layout().addWidget(self.queryText)

        self.editionSplitter.addWidget(self.queryWidget)

        self.horSplitter.addWidget(self.editionSplitter)

        self.emptyMapPage = QWebEnginePage()
        self.emptyMapPage.setHtml(EMPTY_HTML)

        self.manualModePage = QWebEnginePage()
        soup = bs4.BeautifulSoup(EMPTY_HTML, features="html.parser")
        js = soup.new_tag("script")
        js.string = (MANUAL_MODE_JS_SCRIPT % (str([])))
        soup.append(js)

        self.manualModePage.setHtml(str(soup))

        self.mapRenderer = QWebEngineView()
        self.mapRenderer.setMinimumWidth(500)
        self.mapRenderer.setPage(self.emptyMapPage)

        self.consoleSplitter = QSplitter(Qt.Vertical)
        self.consoleSplitter.setChildrenCollapsible(False)
        self.consoleSplitter.addWidget(self.mapRenderer)

        self.consoleWidget = QWidget()
        self.consoleWidget.setLayout(QVBoxLayout())
        self.consoleWidget.layout().setContentsMargins(0, 0, 0, 0)
        self.consoleWidget.layout().setSpacing(0)

        self.consoleHeader = QLabel("Console")
        self.consoleHeader.setSizePolicy(QSizePolicy.Expanding,
                                         QSizePolicy.Fixed)
        self.consoleHeader.setContentsMargins(5, 5, 0, 5)
        self.consoleWidget.layout().addWidget(self.consoleHeader)
        self.consoleWidget.layout().addWidget(self.console)

        self.consoleSplitter.addWidget(self.consoleWidget)

        self.horSplitter.addWidget(self.consoleSplitter)

        self.layout.addWidget(self.horSplitter)

        self.initMenuBar()

        centralWidget = QWidget(self)
        centralWidget.setLayout(self.layout)
        self.setCentralWidget(centralWidget)

        self.setWindowTitle('Python Open Street Map')
コード例 #26
0
ファイル: browser.py プロジェクト: jlt525/emacs-config
 def __init__(self):
     QWebEnginePage.__init__(self)
コード例 #27
0
class Umbrella(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.init_my_location()
        self.setupUi(self)  # 초기화
        # self.url = "http://192.168.0.3:8080/umbrella"
        self.url = "https://sambank.net/umbrella.html"
        self.webEngineView.load(QUrl(self.url))
        self.page = QWebEnginePage()
        self.page.setUrl(QUrl(self.url))
        self.page.setView(self.webEngineView)
        # self.webEngineView2.load(QUrl("http://ncov.mohw.go.kr/bdBoardList_Real.do?brdId=1&brdGubun=11&ncvContSeq=&contSeq=&board_id=&gubun="))

        self.appLoaded = False
        chrome_option = Options()
        chrome_option.add_argument("--headless")
        chrome_option.add_argument("--mute-audio")
        self.browser = webdriver.Chrome(
            chrome_options=chrome_option,
            executable_path="resources/chromedriver.exe")
        self.browser.get(self.url)
        self.user_uuid = uuid.uuid4()
        self.runner = Runner(self)
        self.dc = DataCollector(self)
        self.dm = DataManager(self)
        self.itemList = []
        self.rowList = []
        self.dataChecker = 0

        # self.webEngineView2.load(QUrl(self.dc.html_test()))

        self.initSignal()
        self.timeSeries = self.dc.get_timeseries()
        self.comboBox.addItem("-----")
        for i in sorted(self.timeSeries.keys()):
            self.comboBox.addItem(i)

        #테트리스
        # self.tboard = Board(self.page_3)
        # self.tboard.msg2Statusbar.connect(self.test_1)
        # self.tboard.start()
        # self.tboard.setStyleSheet("background-color:#ffffff")
        # self.tboard.setGeometry(460,0,460,820)

    def test_1(self, msg):
        if msg == "Game over":
            self.tboard.initBoard()
            self.tboard.start()

    def initSignal(self):
        #page 변환
        self.pushButton_3.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton_4.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        self.intro_button.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton_5.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(1))
        self.pushButton__image.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))
        self.pushButton__image2.clicked.connect(
            lambda: self.stackedWidget.setCurrentIndex(0))
        self.pushButton.clicked.connect(self.runner.map_removeMarkers)
        #intro 데이터 입력
        self.lineEdit.returnPressed.connect(
            lambda: self.runner.search(self.lineEdit.text().strip()))
        self.pushButton.clicked.connect(
            lambda: self.runner.search(self.lineEdit.text().strip()))
        self.page.loadFinished.connect(lambda: self.runner.setMap(
            self.my_location_lat, self.my_location_lng))
        self.pushButton2.clicked.connect(self.mark_around)
        self.pushButton3.clicked.connect(lambda: self.runner.setMap(
            self.my_location_lat, self.my_location_lng))
        self.page.urlChanged.connect(self.setButton)
        self.listWidget.itemActivated.connect(self.activateRow)
        self.listWidget.itemClicked.connect(self.rowClicked)
        self.lineEdit.setText(
            self.runner.coord_to_address(self.my_location_lat,
                                         self.my_location_lng, 0))

        self.radio1.clicked.connect(lambda: self.setDataChecker(0))
        self.radio2.clicked.connect(lambda: self.setDataChecker(2))
        self.radio3.clicked.connect(lambda: self.setDataChecker(3))
        self.radio4.clicked.connect(lambda: self.setDataChecker(4))

        self.widget_1.pressed.connect(self.view_graph)
        self.widget_2.pressed.connect(self.view_graph)
        self.widget_3.pressed.connect(self.view_graph)
        self.widget_4.pressed.connect(self.view_graph)

        self.comboBox.currentTextChanged.connect(self.show_timeSeries)

    def show_timeSeries(self, nat):
        if nat in self.timeSeries.keys():
            self.dm.graph_timeseries(self.timeSeries.get(nat))

    def view_graph(self):
        self.stackedWidget.setCurrentIndex(2)

    def mark_around(self):
        print("markaround")
        self.remove_list()
        if not self.page.url().toString().strip().startswith(self.url):
            self.page.load(QUrl(self.url))
            return
        self.runner.map_removeMarkers()
        try:
            lat, lng = self.runner.map_getCenter()
        except:
            print("mark_arount exception")
            return
        data = self.dc.get_data_by_latlng(lat, lng, 1000)
        self.runner.marking(data)
        self.show_list(data)
        self.lineEdit.setText(self.runner.coord_to_address(lat, lng, 0))

    def setDataChecker(self, num):
        self.dataChecker = num

    #표지
    def intro(self):
        data = self.dc.A()
        #Text
        self.dm.show_intro_list(data)
        #그래프
        self.dm.intro_graph(data)

    def init_my_location(self):
        url = 'https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyDQKxbTt0MrFNH85kTJXzickMD5s88UVaI'
        data = {
            'considerIp': True,
        }
        result = requests.post(url, data)
        my_location = json.loads(result.text)
        self.my_location_lat = str(my_location.get('location').get('lat'))
        self.my_location_lng = str(my_location.get('location').get('lng'))

    def setButton(self):
        if self.page.url().toString().strip().startswith(
                "https://sambank.net/umbrella"):
            self.pushButton2.setText("판매처 탐색")
        else:
            self.pushButton2.setText("지도 새로고침")

    def show_list(self, data):
        remainP = [
            '100개 이상', '30개 이상 100개 미만', '2개 이상 30개 미만', '1개 이하', '판매중지'
        ]
        for i in range(len(data)):
            item = QListWidgetItem(self.listWidget)
            row = Item(data[i])
            rs = data[i].get('remain_stat')
            if rs == None:
                row.remain_stat.setStyleSheet('color:red')
            elif remainP.index(rs) <= 1:
                row.remain_stat.setStyleSheet('color:green')
            elif remainP.index(rs) == 2:
                row.remain_stat.setStyleSheet('color:orange')
            else:
                row.remain_stat.setStyleSheet('color:red')
            item.setWhatsThis(str(i))
            item.setSizeHint(row.sizeHint())
            self.listWidget.setItemWidget(item, row)
            self.listWidget.addItem(item)
            self.itemList.append(item)
            self.rowList.append(row)

    def remove_list(self):
        for i in range(len(self.itemList)):
            self.itemList[i].setHidden(True)
        self.itemList = []
        self.rowList = []

    def activateRow(self, row):
        self.runner.setMap(self.rowList[int(row.whatsThis())].lat,
                           self.rowList[int(row.whatsThis())].lng)
        self.runner.info_open(self.rowList[int(row.whatsThis())].code)

    def rowClicked(self, row):
        self.runner.info_close_all()
        self.runner.info_open(self.rowList[int(row.whatsThis())].code)
コード例 #28
0
 def __init__(self, parent=None):
     super().__init__(parent)
     self._flags = QWebEnginePage.FindFlags(0)
コード例 #29
0
ファイル: browser.py プロジェクト: MR-omid/service-provider
from PyQt5.QtCore import QT_VERSION_STR, QUrl, QDir, QObject, pyqtSlot, QJsonValue
from PyQt5.Qt import PYQT_VERSION_STR
from sip import SIP_VERSION_STR

from PyQt5.QtWebChannel import QWebChannel

print("Qt version:", QT_VERSION_STR) # Qt version: 5.11.2
print("SIP version:", SIP_VERSION_STR) # SIP version: 4.19.13
print("PyQt version:", PYQT_VERSION_STR) # PyQt version: 5.11.3
from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView
from PyQt5.QtWidgets import QApplication

app = QApplication([])


Page = QWebEnginePage()
view = QWebEngineView()
Page.setView(view)


class jscall(QObject):
    def __init__(self):
        super().__init__()

        self.result = 'default'

    @pyqtSlot(str)
    def callme(self, arg: str):
        # b = a.toObject()
        print(arg)
コード例 #30
0
ファイル: webbuffer.py プロジェクト: jagguli/webmacs
 def internal_view(self):
     return QWebEnginePage.view(self)
コード例 #31
0
 def __init__(self, parent):
     QWebEnginePage.__init__(self, create_profile(), parent)
     secure_webengine(self, for_viewer=True)
     self.bridge = PreviewBridge(self)
コード例 #32
0
ファイル: webbuffer.py プロジェクト: jagguli/webmacs
 def url(self):
     if self.__delay_loading_url:
         return self.__delay_loading_url.url
     return QWebEnginePage.url(self)
コード例 #33
0
 def find(self, direction):
     text = unicode_type(self.search.text())
     self.view._page.findText(
         text, (QWebEnginePage.FindFlag.FindBackward
                if direction == 'prev' else QWebEnginePage.FindFlags(0)))
コード例 #34
0
 def find(self, forwards=True):
     text = unicode_type(self.search_text.text()).strip()
     flags = QWebEnginePage.FindFlags(
         0) if forwards else QWebEnginePage.FindBackward
     self.find_data = text, flags, forwards
     self.view.findText(text, flags, self.find_callback)
コード例 #35
0
 def __init__(self, parent, tab):
     QWebEnginePage.__init__(self, parent)
     self.tab = tab