コード例 #1
0
ファイル: gui.py プロジェクト: molegend69xz/QUBEKit
class Viewer:
    def __init__(self, molecule_file=None):

        self.molecule_file = molecule_file
        self.view = QWebEngineView()
        self.view.setPage(WebEnginePage(self.view))
        self.view.loadFinished.connect(self.on_load_finish)
        self.html_path = os.path.abspath(
            os.path.join(os.path.dirname(__file__), "view.html"))
        self.local_url = QUrl.fromLocalFile(self.html_path)
        self.view.load(self.local_url)

    def on_load_finish(self, ok):
        if ok and self.molecule_file is not None:
            file = os.path.abspath(self.molecule_file)
            self.load_molecule(file)

    def ready(self, return_value):
        print(return_value)

    def change_view(self, representation):
        print(representation)
        self.view.page().runJavaScript(f'ChangeView("{representation}")',
                                       self.ready)

    def load_molecule(self, file):
        self.view.page().runJavaScript(f'moleculeLoader("{file}")', self.ready)
コード例 #2
0
    class BokehTab(QWidget):
        def __init__(self, nameTab, script, div, time, trace, path):
            super().__init__()
            self.vbox = QVBoxLayout()
            self.hBox = QVBoxLayout()
            self.__info_data_label = QLabel(
                "File: {0};   Time: {1};   Trace: {2};  Path:  {3}".format(nameTab, time, trace, path))
            self.browser = QWebEngineView()
            self.dev = QWebEngineView()
            self.script = script
            self.div = div
            self.name = nameTab
            self.hBox.addWidget(self.browser, stretch=75)
            self.hBox.addWidget(self.dev, stretch=20)
            self.hBox.addWidget(self.__info_data_label, stretch=5)
            # self.hBox.addWidget(self.test, stretch=20)
            self.vbox.addLayout(self.hBox)

            self.controls()
            self.setLayout(self.vbox)

        def controls(self):
            with open(os.path.join("temp", "template.html"), "r")as f:
                template = f.read()
            t = Template(template)
            content = t.substitute(bokeh_script=str(self.script), bokeh_div=str(self.div))
            with open("{}.html".format(os.path.join("temp", self.name)), "w") as f:
                f.write(content)
            self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.JavascriptEnabled, True)
            self.browser.load(QUrl('file:///{}.html'.format("temp/" + self.name)))  # TODO проверить на linux
            self.browser.page().setDevToolsPage(self.dev.page())

        def __controls_test(self):
            self.browser.page().runJavaScript("""$("div:contains('Wiggle')").click()""")
コード例 #3
0
ファイル: markdown_preview.py プロジェクト: Mozzo1000/kettle
class MarkdownPreview(QDockWidget):
    def __init__(self, file, text):
        super().__init__()
        self.file = file
        self.text = text
        self.setWindowTitle('Markdown Preview')
        self.markdown_extras = ['tables', 'fenced-code-blocks', 'task-list']

        text.textChanged.connect(self.on_update)

        self.text.verticalScrollBar().valueChanged.connect(self.sync_scroll)

        self.web = QWebEngineView()
        self.web.setHtml(markdown2.markdown(self.text.toPlainText(),
                                            extras=self.markdown_extras),
                         baseUrl=QUrl.fromLocalFile(file))
        self.web.loadFinished.connect(self.sync_scroll)
        self.setWidget(self.web)

    def sync_scroll(self):
        self.web.page().runJavaScript(
            f'scrollTo({self.text.horizontalScrollBar().value()}, document.body.scrollHeight * {self.text.verticalScrollBar().value()} / {self.text.verticalScrollBar().maximum()});'
        )

    def on_update(self):
        self.web.page().setHtml(markdown2.markdown(
            self.text.toPlainText(), extras=self.markdown_extras),
                                baseUrl=QUrl.fromLocalFile(self.file))
コード例 #4
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.view = QWebEngineView()
        self.view.loadFinished.connect(self._on_load_finished)

        with open(
                '../QWebEngine__append_custom_javascript__jQuery/js/jquery-3.1.1.min.js'
        ) as f:
            self.jquery_text = f.read()
            self.jquery_text += "\nvar qt = { 'jQuery': jQuery.noConflict(true) };"

        tool_bar = self.addToolBar('General')
        action = tool_bar.addAction('Change <a> background-color')
        action.triggered.connect(self._change_background_color)

        self.setCentralWidget(self.view)

    def _on_load_finished(self, ok: bool):
        self.view.page().runJavaScript(self.jquery_text)

    def _change_background_color(self):
        color = QColorDialog.getColor(Qt.yellow)
        if not color.isValid():
            return

        code = "qt.jQuery('a').css('background-color', '{}');".format(
            color.name())
        self.view.page().runJavaScript(code)
コード例 #5
0
def main():

    if not 'visits.db' in os.listdir():
        db.create_all()

    if PyQt_on:

        thread = threading.Thread(target=run_flask_app)
        thread.daemon = True
        thread.start()

        while not url_ok("127.0.0.1", 5000):
            sleep(0.1)

        qt_app = QApplication([])
        qt_app.setWindowIcon(QtGui.QIcon("brain.ico"))
        qt_app.setApplicationName("Рассеянный склероз: тесты/опросники")

        w = QWebEngineView()
        #w = QWebView()
        w.load(QUrl('http://127.0.0.1:5000'))
        w.page().profile().downloadRequested.connect(_downloadRequested)
        w.show()
        qt_app.exec_()
    else:
        url = 'http://localhost:5005/'
        webbrowser.open_new_tab(url)
        app.run(debug=True, port=5005)
コード例 #6
0
ファイル: PyqtCallJS.py プロジェクト: zstar2013/pyqt5
class PyqtCallJS(QWidget):
    def __init__(self):
        super(PyqtCallJS, self).__init__()
        self.setWindowTitle('打开外部网页例子')
        self.setGeometry(5, 30, 1355, 730)
        self.initUI()

    def initUI(self):
        self.browser = QWebEngineView()
        url = os.getcwd() + '/tt.html'
        self.browser.load(QUrl.fromLocalFile(url))
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.layout.addWidget(self.browser)

        button = QPushButton('设置全名')
        button.clicked.connect(self.complete_fullname)
        self.layout.addWidget(button)

    def complete_fullname(self):

        self.value = 'hello world'
        self.browser.page().runJavaScript('fullname("' + self.value + '");',
                                          self.js_callback)

    def js_callback(self, result):
        print(result)
コード例 #7
0
    def __init__(self):
        super().__init__()

        self.setGeometry(0, 0, 1024, 768)

        #self.setStyleSheet("background:black")
        chart = QWebEngineView(self)
        chart.page().setBackgroundColor(Qt.red)
        #button = QPushButton("Test",self)
        #button.resize(50, 50)
        #self.col = QColor(0, 0, 0)
        chart.resize(self.size())
        chart.setAutoFillBackground(True)
        """
        button.setAutoFillBackground(True)
        pa = QPalette()
        #br = pa.dark()
        pa.setColor(QPalette.Window, Qt.red)
        pa.setColor(QPalette.WindowText, Qt.red)
        button.setPalette(pa)

        button.setAutoFillBackground(True)
"""

        self.center()
        self.show()
コード例 #8
0
class SC(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        self.view = QWebEngineView(self)

        self.channel = QWebChannel()
        self.handler = CallHandler()
        self.channel.registerObject('pyjs', self.handler)
        self.view.page().setWebChannel(self.channel)

        self.handler._signal1.connect(self.handler._slot1)
        #self.handler._signal2.connect(self.handler._slot2)

        b1 = QPushButton("b1", self)
        b1.clicked.connect(self.s1s)

        #b2 = QPushButton("b2", self)
        #b2.clicked.connect(self.s2s)

        url_string = "file:///test.html"
        self.view.load(QUrl(url_string))
        self.setGeometry(300, 300, 300, 220)
        self.show()

    def s1s(self):
        self.handler._signal1.emit("b1")

    def s2s(self):
        self.handler._signal2.emit("b2")
コード例 #9
0
class WebPopupWindow(QWidget):
    def __init__(self, profile):
        super().__init__()
        self._view = QWebEngineView(self)

        super().setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
        super().setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

        layout = QVBoxLayout()
        super().setLayout(layout)
        layout.addWidget(self._view)

        self._view.setPage(QWebEnginePage(profile, self._view))

        self._view.titleChanged.connect(super().setWindowTitle)
        self._view.page().geometryChangeRequested.connect(
            self.handleGeometryChangeRequested
        )
        self._view.page().windowCloseRequested.connect(super().close)

    def view(self):
        return self._view

    @pyqtSlot("const QRect")
    def handleGeometryChangeRequested(self, newGeometry):
        self._view.setMinimumSize(newGeometry.width(), newGeometry.height())
        super().move(newGeometry.topLeft() - self._view.pos())
        super().resize(0, 0)
        super().show()
コード例 #10
0
class MapWindow(QDialog):
    rectSignal = pyqtSignal(str)

    def __init__(self, parent=None):
        super(MapWindow, self).__init__(parent)
        self.label = QLabel(self)
        self.setWindowTitle(APP_NAME)
        self.resize(QSize(1400, 900))
        layout = QVBoxLayout(self)
        self.webview = QWebEngineView(self)
        self.channel = QWebChannel(self)
        # 把自身对象传递进去
        self.channel.registerObject('Bridge', self)
        # 设置交互接口
        self.webview.page().setWebChannel(self.channel)
        layout.addWidget(self.webview)
        self.webview.load(
            QUrl.fromLocalFile(APP_HtmlPath + os.sep + "choose_rect.html"))
        self.show()

    @pyqtSlot(str)
    @pyqtSlot(QUrl)
    def getRect(self, rect):
        leftbottom = rect.split(' ')[0]
        righttop = rect.split(' ')[1]
        self.rectSignal.emit(rect)  # 发射信号
        self.close()
コード例 #11
0
ファイル: app.py プロジェクト: coldfire79/pyqt5-test
class FormWidget(QWidget):
    def __init__(self, parent):
        super(FormWidget, self).__init__(parent)
        self.__controls()
        self.__layout()

    def __controls(self):
        html = open(f"{data_dir}/test.html", 'r').read()
        self.browser = QWebEngineView()
        self.browser.setPage(WebEnginePage(self.browser))
        self.browser.setHtml(html)
        self.browser.loadFinished.connect(self.onLoadFinished)

    def onLoadFinished(self, ok):
        if ok:
            self.browser.page().runJavaScript("helloWorld(1, \"12\")",
                                              self.ready)

    def __layout(self):
        self.vbox = QVBoxLayout()
        self.hBox = QVBoxLayout()
        self.hBox.addWidget(self.browser)
        self.vbox.addLayout(self.hBox)
        self.setLayout(self.vbox)

    def ready(self, returnValue):
        print(returnValue)
コード例 #12
0
ファイル: dialog.py プロジェクト: Sugarrrrrrrrrr/StatusCenter
class Dialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.m_view = QWebEngineView(self)
        self.channel = QWebChannel(self)
        self.b = bridge(self)

        self.channel.registerObject('b', self.b)
        self.m_view.page().setWebChannel(self.channel)
        self.m_view.page().load(
            QUrl("file:///" + QFileInfo("index.html").absoluteFilePath()))

        self.ui.viewLayout.addWidget(self.m_view)
        # js_str = '''window.bridge.showMsgBox()'''
        js_str = '''alert('from runJavaScript')'''
        self.ui.pbAlert.clicked.connect(
            lambda: self.m_view.page().runJavaScript(js_str, self.callback))
        # self.ui.pbAlert.clicked.connect(lambda: self.b.sendText.emit())

        # self.ui.pbGetWebWidth.clicked.connect(lambda: self.b.sendText.emit())

        # self.b.sendText.connect(lambda: print('b.sendText.emit():'))
        # self.b.signal_1.connect(lambda: print('b.signal_1.emit():'))

    def __del__(self):
        del self.ui

    def callback(self, v):
        print('callback:', v)
コード例 #13
0
class WebEngineView(QMainWindow):
    def __init__(self):
        super(WebEngineView, self).__init__()
        self.setWindowTitle('显示本地网页')
        self.setWindowIcon(QIcon(QPixmap('../images/python.png')))
        self.resize(1500, 700)
        self.unit_ui()

    def unit_ui(self):
        self.browser = QWebEngineView()
        # 得到当前文件目录   由于Qurl不识别相对路径
        url = os.getcwd()
        # print(url)
        self.browser.load(QUrl.fromLocalFile(url + '/测试.html'))
        self.layout().addWidget(self.browser)

        # button调用js
        button = QPushButton('改变颜色')
        self.layout().addWidget(button)
        button.move(800, 50)
        button.clicked.connect(self.get_div)

    # 调用js
    def get_div(self):
        self.browser.page().runJavaScript('get_p()', self.callback)

    # js回调
    @staticmethod
    def callback(result):
        print(result)
コード例 #14
0
class MainWindow(QWebEnginePage):
    # noinspection PyUnresolvedReferences
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 设置窗口标题
        # self.setWindowTitle('My Browser')
        # 设置窗口图标
        # self.setWindowIcon(QIcon('icons/penguin.png'))
        # 设置窗口大小900*600
        # self.resize(900, 600)
        # self.show()

        # 2
        self.view = QWebEngineView()
        channel = QWebChannel()
        handler = CallHandler()
        channel.registerObject('handler', handler)
        self.view.page().setWebChannel(channel)
        self.view.loadFinished.connect(self._loadFinish)

        # 添加浏览器到窗口中
        # self.setCentralWidget(self.view)

        #
        htmlUrl = 'file:////Users/play/github/Python_Master_Courses/GUI图形界面/pyqt5/pyqt5-javascript-互相传值/js1.html'
        self.view.load(QUrl(htmlUrl))
        self.view.show()

    # 3
    def _loadFinish(self, *args, **kwargs):
        # self.view.page().runJavaScript("window.show()")
        self.view.page().runJavaScript("call_python()")
        print("qt load finish view.loadFinished.connect(self._loadFinish)")
コード例 #15
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.m_view = QWebEngineView()
        self.setCentralWidget(self.m_view)

        page = self.m_view.page()
        page.featurePermissionRequested.connect(
            self.on_featurePermissionRequested)
        page.load(QUrl("https://maps.google.com"))

    @pyqtSlot(QUrl, QWebEnginePage.Feature)
    def on_featurePermissionRequested(self, securityOrigin, feature):
        if feature != QWebEnginePage.Geolocation:
            return

        mgsbox = QMessageBox(self)
        mgsbox.setAttribute(Qt.WA_DeleteOnClose)
        mgsbox.setText(
            self.tr("%s wants to know your location" %
                    (securityOrigin.host(), )))
        mgsbox.setInformativeText(
            self.tr(
                "Do you want to send your current location to this website?"))
        mgsbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        mgsbox.setDefaultButton(QMessageBox.Yes)

        page = self.m_view.page()

        if mgsbox.exec_() == QMessageBox.Yes:
            page.setFeaturePermission(securityOrigin, feature,
                                      QWebEnginePage.PermissionGrantedByUser)
        else:
            page.setFeaturePermission(securityOrigin, feature,
                                      QWebEnginePage.PermissionDeniedByUser)
コード例 #16
0
class BookView(QSplitter):
    def __init__(self, parent=None):
        super(BookView, self).__init__(parent=parent)
        self.create_layout()
        self.create_connections()

    def create_layout(self):
        self.web_view = QWebEngineView()
        self.chapter_list = QListWidget()
        self.next_button = QPushButton("Next chapter")
        self.previous_button = QPushButton("Previous chapter")

        hbox = QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(self.previous_button)
        hbox.addWidget(self.next_button)

        vbox = QVBoxLayout()
        vbox.addWidget(QLabel("Chapters"))
        vbox.addWidget(self.chapter_list)
        vbox.addLayout(hbox)

        widget = QWidget()
        widget.setLayout(vbox)
        self.web_view.setUrl(QtCore.QUrl("http://"))
        self.webPage = self.web_view.page()

        self.addWidget(self.web_view)
        self.addWidget(widget)

    def create_connections(self):
        chlist = self.chapter_list
        self.next_button.clicked.connect(lambda:
                                         chlist.setCurrentRow(0
                                                              if chlist.currentRow() == chlist.count() - 1
                                                              else chlist.currentRow() + 1))
        self.previous_button.clicked.connect(lambda:
                                             chlist.setCurrentRow(chlist.count() - 1
                                                                  if chlist.currentRow() == 0
                                                                  else chlist.currentRow() - 1))
        self.chapter_list.currentRowChanged[int].connect(self.set_chapter)

    def set_chapter(self, num=None):
        if num is None:
            num = self.chapter_list.currentRow()
        if num < 0:
            num = len(self.book.chapters) - 1
        elif num >= len(self.book.chapters):
            num = 0
        self.web_view.setHtml(self.book.get_chapter(num).decode(encoding="utf-8"))
        self.webPage = self.web_view.page()
        self.webPage.setZoomFactor(2)

    def load_book(self, book_id):
        self.book = Book(book_id)
        self.chapter_list.clear()
        for chapter in self.book.chapters:
            self.chapter_list.addItem(chapter[0])
        self.chapter_list.setCurrentRow(0)
コード例 #17
0
class Window(BaseWindow):
    def __init__(self):
        self.debug = 1
        self.app = QApplication(sys.argv)
        self.desktop = QApplication.desktop()
        self.web = QWebEngineView()
        self.icon = QIcon(ICON)
        #self.web.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)

        self.web.titleChanged.connect(self.title_changed)
        self.web.iconUrlChanged.connect(self.icon_changed)
        self.web.page().windowCloseRequested.connect(self.close_window)
        self.web.page().geometryChangeRequested.connect(self.set_geometry)

    def show(self, window_state):
        if window_state == "maximized" and not self.web.isMaximized():
            self.web.showNormal()
            self.web.showMaximized()
        elif window_state == "fullscreen" and not self.web.isFullScreen():
            self.web.showNormal()
            self.web.showFullScreen()
        elif window_state == "normal":
            self.web.showNormal()
        else:
            self.web.show()

    def run(self):
        return self.app.exec_()

    def set_debug(self, debuglevel):
        self.debug = debuglevel

    def set_geometry(self, geom):
        self.web.setGeometry(geom)

    def close_window(self):
        sys.exit()

    def icon_changed(self):
        if not self.icon.isNull():
            self.web.setWindowIcon(self.icon)

    def title_changed(self, title):
        self.web.setWindowTitle(title)

    def load_url(self, url):
        self.url = QUrl.fromEncoded(url)
        self.web.setUrl(self.url)

    def set_size(self, width, height):
        if width <= 0:
            width = 640
        if height <= 0:
            height = 480

        left = (self.desktop.width() - width) / 2
        top = (self.desktop.height() - height) / 2

        self.web.setGeometry(left, top, width, height)
コード例 #18
0
class PrintXiaoWei(QWidget):
    def __init__(self, base_path):
        super(PrintXiaoWei, self).__init__()
        self.filename = base_path + "案件信息.xlsx"
        self.base_path = base_path
        self.resize(800, 600)
        style_str = "QLabel{font-size: 30px;}" + "QLineEdit{font-size: 30px;}" + \
                    "QPushButton{font-size: 25px; background-color: green; min-height: 35px}" + \
                    "QComboBox{font-size: 30px;}" + "QCheckBox{font-size: 30px;}" + \
                    "QHeaderView{font-size: 25px;} QTableWidget{font-size: 25px;}" + \
                    "QDateTimeEdit{font-size: 30px;} QMessageBox{font-size: 30px;}"
        self.setStyleSheet(style_str)

        wb = openpyxl.load_workbook(self.filename)

        self.browser = QWebEngineView()
        self.browser.settings().setAttribute(
            QWebEngineSettings.AllowRunningInsecureContent, True)

        url = "C:/html_tmp/xiaowei.html"
        self.browser.load(QUrl(url))

        layout = QGridLayout()

        yan_data = get_yan_info(wb)
        row_index = 0
        for i in range(math.ceil(len(yan_data) / 16)):
            print_xbtz = PrintBtn(index=i, name="先保通知单%d" % (i + 1))
            print_xbtz.clicked.connect(self.print_xbtz)
            layout.addWidget(print_xbtz, row_index, 0)
            row_index += 1
        for i in range(math.ceil(len(yan_data) / 10)):
            print_ky = PrintBtn(index=i, name="现场勘验笔录%d" % (i + 1))
            print_ky.clicked.connect(self.print_ky)
            layout.addWidget(print_ky, row_index, 0)
            row_index += 1
        self.btn_print_fm = QPushButton("打印封面")
        self.btn_print_fm.clicked.connect(self.print_fm)
        layout.addWidget(self.btn_print_fm, row_index + 1, 0)
        self.btn_back = QPushButton("修改数据")
        layout.addWidget(self.btn_back, row_index + 2, 0)
        self.btn_next = QPushButton("下一步")
        layout.addWidget(self.btn_next, row_index + 3, 0)
        layout.addWidget(self.browser, row_index + 4, 0)
        self.setLayout(layout)

    def print_xbtz(self):
        sender = self.sender()
        self.browser.page().runJavaScript("print_xianbaotz%d();" %
                                          sender.index)

    def print_ky(self):
        sender = self.sender()
        filename = self.base_path + "小微勘验%d.docx" % sender.index
        os.system('ksolaunch %s' % filename)

    def print_fm(self):
        filename = self.base_path + "封面.docx"
        os.system('ksolaunch %s' % filename)
コード例 #19
0
ファイル: qt5.py プロジェクト: cris-b/oma-welcome
class Window(BaseWindow):
    def __init__(self):
        self.debug=1
        self.app = QApplication(sys.argv)
        self.desktop= QApplication.desktop()
        self.web = QWebEngineView()
        self.icon = QIcon(ICON)
        #self.web.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
      
        self.web.titleChanged.connect(self.title_changed)
        self.web.iconUrlChanged.connect(self.icon_changed)
        self.web.page().windowCloseRequested.connect(self.close_window)
        self.web.page().geometryChangeRequested.connect(self.set_geometry)
    
    def show(self,window_state):
        if window_state == "maximized" and not self.web.isMaximized():
            self.web.showNormal()
            self.web.showMaximized()
        elif window_state == "fullscreen" and not self.web.isFullScreen():
            self.web.showNormal()
            self.web.showFullScreen()
        elif window_state == "normal":
            self.web.showNormal()
        else:
            self.web.show()

    def run(self):
        return self.app.exec_()
                
    def set_debug(self, debuglevel):
        self.debug=debuglevel
    
    def set_geometry(self,geom ):
        self.web.setGeometry(geom)
        
    def close_window(self):
        sys.exit()
    
    def icon_changed(self):
        if not self.icon.isNull():
            self.web.setWindowIcon(self.icon)
            
    def title_changed(self, title):
        self.web.setWindowTitle(title)

    def load_url(self,url):
        self.url=QUrl.fromEncoded(url)
        self.web.setUrl(self.url)
    
    def set_size(self,width, height):
        if width<=0:
            width=640
        if height<=0:
            height=480
        
        left=(self.desktop.width()-width)/2
        top=(self.desktop.height()-height)/2
        
        self.web.setGeometry(left,top,width,height)
コード例 #20
0
class Web2PyQt5(QWidget, Ui_Form):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(Web2PyQt5, self).__init__(parent)
        self.setupUi(self)
        self.initUi()

    def initUi(self):
        self.splitter.setStretchFactor(0, 1)
        self.splitter.setStretchFactor(1, 7)
        self.setWindowFlags(Qt.WindowCloseButtonHint)
        vLayout = QVBoxLayout()
        vLayout.setContentsMargins(0, 0, -1, -1)
        url = QUrl(QFileInfo("./webchannel.html").absoluteFilePath())
        self.view = QWebEngineView(self.widget)
        vLayout.addWidget(self.view)
        self.widget.setLayout(vLayout)
        self.view.load(url)

    @pyqtSlot()
    def on_pb_submit_clicked(self):
        """
        Slot documentation goes here.
        """
        if self.lineEdit_username.text() == "":
            QMessageBox.warning(self, "警告", "用户名没有输入")
            self.lineEdit_username.setFocus()
        elif self.lineEdit_pwd.text() == "":
            QMessageBox.warning(self, "警告", "密码没有输入")
            self.lineEdit_pwd.setFocus()
        else:
            name = self.lineEdit_username.text()
            pwd = self.lineEdit_pwd.text()
            jscode = "PyQt52WebValue('{}','{}');".format(name, pwd)
            self.view.page().runJavaScript(jscode)

    @pyqtSlot()
    def on_pb_reset_clicked(self):
        """
        PyQt5的输入栏内容清空
        """
        self.lineEdit_username.setText("")
        self.lineEdit_pwd.setText("")

    def setLineEdit(self, list):
        self.lineEdit_username.setText(list[0])
        self.lineEdit_pwd.setText(list[1])

    def __del__(self):
        self.view.deleteLater()
コード例 #21
0
class BrowserWidget(QtWidgets.QWidget):
    def __init__(self):
        """
            Create main window with browser and a button
        """
        super(BrowserWidget, self).__init__()

        self.layout = QtWidgets.QHBoxLayout()
        self.setLayout(self.layout)

        self.webview = QWebView()
        self.layout.addWidget(self.webview)

        self.webview.urlChanged.connect(self.url_changed)

        self.set_form_handler(self._default_form_handler)

        #self.default_url = "https://dokit.met.no/fou/kl/prosjekter/eemep/esnap_userdoc"
        #self.tb_url.setText(self.default_url)
        #self.browse()

    def browse(self):
        """browse an url"""
        url = self.tb_url.text() if self.tb_url.text() else self.default_url
        self.webview.setPage(QWebPage())
        self.webview.load(QtCore.QUrl(url))
        self.webview.show()

    def url_changed(self, url):
        """ Triggered when the url is changed """

    def set_html(self, text: str):
        """ set html string"""
        self.web_page = StartWebPage()
        self.webview.setPage(self.web_page)
        self.webview.page().formSubmitted.connect(self._handle_formSubmitted)
        self.webview.setHtml(text)

    @staticmethod
    def _default_form_handler(dict):
        for key, value in dict:
            print(str.format("{0} => {1}", key, value))

    def set_form_handler(self, handler):
        """ the form handler should accept a dictionary with query results as input """
        self.form_handler = handler

    def evaluate_javaScript(self, jscript):
        self.webview.page().mainFrame().evaluateJavaScript(jscript)

    def _handle_formSubmitted(self, url):
        # I don't manage to get the right query strings from the web-page
        print("handleFromSubmitted:" + url.toString())
        self.form_handler(
            QtCore.QUrlQuery(url).queryItems(QtCore.QUrl.FullyDecoded))
コード例 #22
0
class ChartWidget(QWidget):
    """ 图形显示控件 """
    save_option_signal = pyqtSignal(str)

    def __init__(self, *args, **kwargs):
        super(ChartWidget, self).__init__(*args, *kwargs)
        main_layout = QVBoxLayout()
        main_layout.setContentsMargins(QMargins(0, 0, 0, 0))

        self.chart_container = QWebEngineView(self)
        self.chart_container.load(QUrl("file:///html/charts/custom_chart.html"))   # 加载页面
        # 设置与页面信息交互的通道
        channel_qt_obj = QWebChannel(self.chart_container.page())                  # 实例化qt信道对象,必须传入页面参数
        self.contact_channel = ChartOptionChannel()                                # 页面信息交互通道
        self.chart_container.page().setWebChannel(channel_qt_obj)
        channel_qt_obj.registerObject("pageContactChannel", self.contact_channel)  # 信道对象注册信道,只能注册一个

        main_layout.addWidget(self.chart_container)

        other_layout = QHBoxLayout()
        self.decipherment_edit = QLineEdit(self)
        self.decipherment_edit.setPlaceholderText("此处填写对图形的文字解读(非必填)")
        other_layout.addWidget(self.decipherment_edit)

        self.private_check = QCheckBox(self)
        self.private_check.setText("仅自己可见")
        other_layout.addWidget(self.private_check)

        save_button = QPushButton("保存图形", self)
        save_menu = QMenu(save_button)
        chart_action = save_menu.addAction("普通图形")
        setattr(chart_action, "chart_type", "normal")
        chart_action.triggered.connect(self.save_chart_option)
        season_action = save_menu.addAction("季节图形")
        setattr(season_action, "chart_type", "season")
        season_action.triggered.connect(self.save_chart_option)
        save_button.setMenu(save_menu)
        other_layout.addWidget(save_button)
        main_layout.addLayout(other_layout)

        self.setLayout(main_layout)

    def save_chart_option(self):
        """ 保存当前的图形配置 """
        action = self.sender()
        normal = getattr(action, "chart_type")
        self.save_option_signal.emit(normal)

    def show_chart(self, chart_type, option, values, headers):
        """ 显示图形
        option:(json字符串)基础的图形配置,
        values:(json字符串)用于绘图的数据
        """
        self.contact_channel.chartSource.emit(chart_type, option, values, headers)
コード例 #23
0
class PyFactorialDemo(QWidget):
    def __init__(self):
        super(PyFactorialDemo, self).__init__()
        self.setWindowTitle("PyFactorialDemo")
        self.resize(500, 500)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.browser = QWebEngineView()
        self.browser.load(QUrl.fromLocalFile(os.getcwd() + './t3.html'))
        self.layout.addWidget(self.browser)
        channel.registerObject("obj", factorial)
        self.browser.page().setWebChannel(channel)
コード例 #24
0
class window(QWidget):
    def __init__(self):
        super().__init__()
        self.setup()

    def setup(self):
        self.flag = False
        self.box = QVBoxLayout(self)  # 创建一个垂直布局来放控件''
        #添加收货地址页面,运行页面js
        #人工校验地址成功后,进入商品页面
        self.btn_a = QPushButton('淘宝')
        self.btn_a.clicked.connect(self.to_a)
        self.btn_b = QPushButton('百度')
        self.btn_b.clicked.connect(self.to_b)
        self.btn_get = QPushButton('get')
        self.btn_get.setVisible(False)
        self.btn_get.clicked.connect(self.get)
        self.btn_start = QPushButton('启动')
        self.btn_start.clicked.connect(self.start)
        self.web = QWebEngineView()  # 创建浏览器组件对象
        self.web.resize(1200, 900)  # 设置大小
        self.web.load(QUrl("https://www.baidu.com"))  # 打开页面
        self.box.addWidget(self.btn_a)
        self.box.addWidget(self.btn_b)
        self.box.addWidget(self.btn_get)
        self.box.addWidget(self.btn_start)
        self.box.addWidget(self.web)  # 再放浏览器
        self.web.show()  # 最后让页面显示出来
        self.setWindowTitle("贝贝拍单工具")

    #进入商品购买页面
    def to_a(self):
        self.web.load(QUrl("http://www.taobao.com"))
        #self.btn_get.click()
    def to_b(self):
        self.web.load(QUrl("http://www.baidu.com"))
        #self.btn_get.click()

    def get(self):
        self.web.page().toHtml(self.sku_html)

    def start(self):
        if self.flag:
            self.flag = False
        else:
            self.flag = True

    #将sku页面信息的内容赋值给窗体对象
    def sku_html(self, html):
        if html.find("www.baidu.com") != -1:
            print("www.baidu.com")
        else:
            print("www.taobao.com")
コード例 #25
0
ファイル: frameui.py プロジェクト: wl55387370/JMTOOL
def run(p='.'):
    app = QApplication(sys.argv)
    view = QWebEngineView()
    channel = QWebChannel()
    handler = monkey.op()
    channel.registerObject('pyjs', handler)
    view.page().setWebChannel(channel)
    url_string = p + "/lib/pages/index.html"
    view.load(QUrl(url_string))
    view.resize(1366, 880)
    view.show()
    sys.exit(app.exec_())
コード例 #26
0
 def initBrowser(self):
     view = QWebEngineView()
     channel = QWebChannel()
     handler = CallHandler(self)
     channel.registerObject('pyjs', handler)
     view.page().setWebChannel(channel)
     url_string = "https://bing.com"
     view.load(QUrl(url_string))
     view.show()
     self.view = view
     self.channel = channel
     self.handler = handler
コード例 #27
0
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(640, 320)
        self.setWindowTitle('PyQt-5 WebEngine')

        page = "https://www.google.com"

        self.url = QLineEdit(page)
        self.url.setPlaceholderText(page)

        self.go = QPushButton("Ir")
        self.go.clicked.connect(self.btnIrClicked)

        self.nav_bar = QHBoxLayout()
        self.nav_bar.addWidget(self.url)
        self.nav_bar.addWidget(self.go)

        self.progress = QProgressBar()
        self.progress.setValue(0)

        html = """
        <!DOCTYPE HTML>
            <html>
                <head>
                    <title>Example Local HTML</title>
                </head>
                <body>
                    <p>Este es un archivo <code>HTML</code> local.</p>
                    <p>Si deseas acceder página indica su <code>URL</code> y presiona <b>Ir</b></p>
                </body>
            </html>
        """

        self.web_view = QWebEngineView()
        self.web_view.loadProgress.connect(self.webLoading)
        self.web_view.setHtml(html)

        root = QVBoxLayout()
        root.addLayout(self.nav_bar)
        root.addWidget(self.web_view)
        root.addWidget(self.progress)

        self.setLayout(root)

    def btnIrClicked(self, event):
        url = QUrl(self.url.text())
        self.web_view.page().load(url)

    def webLoading(self, event):
        self.progress.setValue(event)
コード例 #28
0
class PyChrome(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(640, 320)
        self.setWindowTitle('PyQt-5 WebEngine')

        page = "https://www.google.com"

        self.url = QLineEdit(page)
        self.url.setPlaceholderText(page)

        self.go = QPushButton("Ir")
        self.go.clicked.connect(self.btnIrClicked)

        self.nav_bar = QHBoxLayout()
        self.nav_bar.addWidget(self.url)
        self.nav_bar.addWidget(self.go)

        self.progress = QProgressBar()
        self.progress.setValue(0)

        html = """
        <!DOCTYPE HTML>
            <html>
                <head>
                    <title>Example Local HTML</title>
                </head>
                <body>
                    <p>Este es un archivo <code>HTML</code> local.</p>
                    <p>Si deseas acceder página indica su <code>URL</code> y presiona <b>Ir</b></p>
                </body>
            </html>
        """

        self.web_view = QWebEngineView()
        self.web_view.loadProgress.connect(self.webLoading)
        self.web_view.setHtml(html)

        root = QVBoxLayout()
        root.addLayout(self.nav_bar)
        root.addWidget(self.web_view)
        root.addWidget(self.progress)

        self.setLayout(root)

    def btnIrClicked(self, event):
        url = QUrl(self.url.text())
        self.web_view.page().load(url)

    def webLoading(self, event):
        self.progress.setValue(event)
コード例 #29
0
ファイル: main.py プロジェクト: chaochon/pyqt_learning_notes
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowTitle('Javascript call PyQt5')
        self.setGeometry(5, 30, 1355, 730)
        self.browser = QWebEngineView()
        # 加载外部的web界面
        url = QUrl(QFileInfo("./web_file1.html").absoluteFilePath())
        self.browser.load(url)
        self.setCentralWidget(self.browser)

    def calljs(self):
        jscode = "PyQt52WebValue('你好web');"
        self.browser.page().runJavaScript(jscode)
コード例 #30
0
ファイル: main.py プロジェクト: dec1/stackoverflow-egs
class Example(QMainWindow):
    htmlPath = QDir.current()
    htmlPath.cd("html")
    def __init__(self):
        super().__init__()

        self.setObjectName('Main')
        QMetaObject.connectSlotsByName(self)

        self.view = QWebEngineView()
        self.view.settings().setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
        self.view.setObjectName('MapWidget')

        self.window = QWidget()
        self.window.setObjectName('MainWidget')
        self.layout = QGridLayout(self.window)
        self.layout.addWidget(self.view)
        self.setCentralWidget(self.window)

        self.channel = QWebChannel(self.view.page())
        self.view.page().setWebChannel(self.channel)
        self.channel.registerObject("jshelper", self)

        principal = Figure()
        js = JavascriptLink(QUrl.fromLocalFile(self.htmlPath.absoluteFilePath("qwebchannel.js")).toString())
        principal.header.add_child(Element(js.render()))
        map = folium.Map(location=[36, -108],
                             zoom_start=5, tiles='StamenWatercolor').add_to(principal)
        fastestRoute = folium.PolyLine(((40, -110), (50, -110)),
                                       weight=5, color='blue').add_to(map)

        f = Figure()
        f.html.add_child(Element('<button id="myBtn">Try it</button>'))
        f.html.add_child(Element('<p>\n TEST \n</p>'))

        link = JavascriptLink(QUrl.fromLocalFile(self.htmlPath.absoluteFilePath("popup.js")).toString())
        f.html.add_child(Element(link.render()))

        iframe = branca.element.IFrame(html=f.render(), width=500, height=300)
        popup = folium.Popup(iframe, max_width=500)
        fastestRoute.add_child(popup)

        principal.save(self.htmlPath.absoluteFilePath("test.html"))
        self.view.load(QUrl().fromLocalFile(self.htmlPath.absoluteFilePath("test.html")))
        self.setGeometry(100, 100, 1200, 900)
        self.show()

    @pyqtSlot(str)
    def pathSelected(self, lat):
        print(lat)
コード例 #31
0
class Form(QWidget):
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)

        # 레이아웃 선언 및 Form Widget에 설정
        self.layout_1 = QBoxLayout(QBoxLayout.LeftToRight, self)
        self.layout_2 = QBoxLayout(QBoxLayout.LeftToRight)
        self.layout_3 = QBoxLayout(QBoxLayout.TopToBottom)

        # 부모 레이아웃에 자식 레이아웃을 추가
        self.layout_1.addLayout(self.layout_2)
        self.layout_1.addLayout(self.layout_3)

        self.web = QWebEngineView()
        self.pb_1 = QPushButton("요청하기")
        self.pb_2 = QPushButton("밝기지도")
        self.pb_3 = QPushButton("길찾기")
        # self.te_1 = QTextEdit()

        # Web과 통신할 수 있게 채널링
        channel = QWebChannel(self.web.page())
        self.web.page().setWebChannel(channel)
        self.handler = CallHandler()  # 반드시 인스턴스 변수로 사용해야 한다.
        channel.registerObject('handler', self.handler)  # js에서 불리울 이름

        self.setLayout(self.layout_1)
        self.init_widget()

    def init_widget(self):
        self.setWindowTitle("QWebChannel")
        self.setFixedWidth(360)
        self.setFixedHeight(640)

        # 로컬파일 사용시 절대경로만 사용해야 함
        #url = QDir().current().filePath("html/QWebEngineView_02_WebChannel.html")
        url = os.path.join(settings.BASE_DIR, 'Lumos_UI', 't-map',
                           'index.html')
        url = QUrl.fromLocalFile(url)
        self.web.load(url)

        # 핸들러 시그널 버튼이 눌러지면 console로 Hi를 보낸다.
        self.pb_1.clicked.connect(
            lambda v: self.handler.getText.emit(txt))  ##경로얻어오기
        self.pb_2.clicked.connect(
            lambda v: self.web.setUrl(QUrl("http://google.com")))  ##밝기지도
        self.pb_3.clicked.connect(
            lambda v: self.web.setUrl(QUrl(url)))  ##길찾기 API

        self.layout_2.addWidget(self.web)
コード例 #32
0
ファイル: test.py プロジェクト: opensourcer2/ZeronetBrowser
    def test_webview(self):
        from PyQt5.QtWebEngineWidgets import QWebEngineView
        from PyQt5.QtCore import QUrl, QTimer

        app = QApplication([])
        view = QWebEngineView()
        # Use a raw string to avoid accidental special characters in Windows filenames:
        # ``c:\temp`` is `c<tab>emp`!
        view.load(QUrl("http://www.pyinstaller.org"))
        view.show()

        view.page().loadFinished.connect(
            # Display the web page for one second after it loads.
            lambda ok: QTimer.singleShot(5000, app.quit))
        app.exec_()
コード例 #33
0
ファイル: ow_x0h_NEW.py プロジェクト: lucarebuffi/XRayServer
class X0h(XrayServerWidget):
    name = "X0h"
    description = "X0h"
    icon = "icons/x0h.png"
    maintainer = "Luca Rebuffi"
    maintainer_email = "luca.rebuffi(@at@)elettra.eu"
    priority = 1
    category = "X0h"
    keywords = ["data", "file", "load", "read"]

    want_main_area = 1

    outputs = [{"name": "xrayserver_data",
                "type": DataExchangeObject,
                "doc": "xrayserver_data",
                "id": "xrayserver_data"}, ]

    def __init__(self):
        super().__init__()

        left_box_1 = oasysgui.widgetBox(self.controlArea, "X0h Request Form", addSpace=True, orientation="vertical",
                                         width=610, height=640)

        html = self.clear_input_form(HttpManager.send_xray_server_direct_request("/cgi/www_form.exe?template=x0h_form.htm"))

        self.x0h_input = QWebView(left_box_1)
        self.x0h_input.setHtml(html)

        left_box_1.layout().addWidget(self.x0h_input)

        self.x0h_input.setFixedHeight(540)
        self.x0h_input.setFixedWidth(590)

        button = gui.button(self.controlArea, self, "Get X0h!", callback=self.submit)
        button.setFixedHeight(30)

        gui.rubber(self.controlArea)

        self.tabs = []
        self.tabs_widget = oasysgui.tabWidget(self.mainArea)
        self.initializeTabs()

        self.x0h_output = QWebView(self.tabs[0])

        self.tabs[0].layout().addWidget(self.x0h_output)

        self.x0h_output.setFixedHeight(630)
        self.x0h_output.setFixedWidth(740)


    def clear_input_form(self, html):
        temp_1 = html.split("<body onload=\"setOnloads()\">")[0]
        temp_2 = html.split("<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>")[1]

        html = temp_1 + "<body>\n<table cellspacing=0 cellpadding=0 border=0 bgcolor=\"#c1c1c1\"><tr><td>\n" + temp_2

        html = html.split("<input type=SUBMIT value=\"Get X0h!\"><input type=RESET> <br>")[0]
        html += "\n<input type=SUBMIT style=\"display: none;\" id=\"submit-btn\"><input type=RESET style=\"display: none;\" id=\"reset-btn\"> <br>"
        html += "\n</form>"
        html += "\n</td></tr></table>"
        html += "\n</td></tr></table>"
        html += "\n</body>"
        html += "\n</html>"

        temp_1, temp_2 = html.split("x0h.js")
        html = temp_1 + XRAY_SERVER_URL + "/x0h.js" + temp_2

        temp_1, temp_2 = html.split("/cgi/x0h_form.exe")
        html = temp_1 + XRAY_SERVER_URL + "/cgi/x0h_form.exe" + temp_2

        return html

    def getLeftPartWidth(self):
        return 620

    def initializeTabs(self):
        current_tab = self.tabs_widget.currentIndex()

        size = len(self.tabs)

        for index in range(0, size):
            self.tabs_widget.removeTab(size-1-index)

        self.tabs = [gui.createTabPage(self.tabs_widget, "X-ray Server Ouput"),
                     gui.createTabPage(self.tabs_widget, "Critical Angle for TER"),
                     gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C3" + " Pol.)"),
                     gui.createTabPage(self.tabs_widget, "Darwin Curve (" + u"\u03C0" + " Pol.)"),
                     ]

        for tab in self.tabs:
            tab.setFixedHeight(650)
            tab.setFixedWidth(750)

        self.plot_canvas = [None, None, None]

        self.tabs_widget.setCurrentIndex(current_tab)

    def js_callback(self, result):
        pass

    def _callable_1(self, html):
        self.original_signal = self.x0h_input.loadFinished
        self.x0h_input.loadFinished.connect(self.loadFinished)
        self.x0h_input.setHidden(True)
        self.x0h_input.page().runJavaScript("document.getElementById('submit-btn').click()", self.js_callback)

    def loadFinished(self):
        self.x0h_input.page().toHtml(self._callable_2)

    def _callable_2(self, html):
        try:
            self.x0h_input.loadFinished.disconnect()
            self.x0h_input.back()
            self.x0h_input.setHidden(False)

            response_1 = self.clear_response(html)
            response_2 = self.clear_response(html)

            self.tabs_widget.setCurrentIndex(0)

            self.x0h_output.setHtml(response_1)

            data0, data1, data2 = self.extract_plots(response_2)

            exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
            exchange_data.add_content("reflectivity", data0)
            exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
            exchange_data.add_content("x-ray_diffraction_profile_sigma", data1)
            exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805)
            exchange_data.add_content("x-ray_diffraction_profile_pi", data2)
            exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805)

            self.send("xrayserver_data", exchange_data)


        except urllib.error.HTTPError as e:
            self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: '
                                    + str(e.code) + "\n\n" +
                                    server.BaseHTTPRequestHandler.responses[e.code][1])

        except urllib.error.URLError as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                    + e.reason)

        except XrayServerException as e:
            ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self)

        except Exception as e:
            self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                    + str(e))

        self.tabs_widget.setCurrentIndex(0)
        self.setStatusMessage("")
        self.progressBarFinished()

    def submit(self):
        self.progressBarInit()
        self.setStatusMessage("Submitting Request")

        if platform.system() == 'Darwin':
            self.x0h_input.page().toHtml(self._callable_1)

        elif platform.system() == 'Linux':
            doc = self.x0h_input.page().mainFrame().documentElement()
            submit_btn = doc.findFirst("input[id=submit-btn]")

            try:
                response = ""
                #response = HttpManager.send_xray_server_request_POST(APPLICATION, parameters)
                response = self.clear_response(response)

                self.tabs_widget.setCurrentIndex(0)
                self.x0h_output.setHtml(response)

                data0, data1, data2 = self.extract_plots(response)

                exchange_data = DataExchangeObject("XRAYSERVER", "X0H")
                exchange_data.add_content("reflectivity", data0)
                exchange_data.add_content("reflectivity_units_to_degrees", 1.0)
                exchange_data.add_content("x-ray_diffraction_profile_sigma", data1)
                exchange_data.add_content("x-ray_diffraction_profile_sigma_units_to_degrees", 0.000277777805)
                exchange_data.add_content("x-ray_diffraction_profile_pi", data2)
                exchange_data.add_content("x-ray_diffraction_profile_pi_units_to_degrees", 0.000277777805)

                self.send("xrayserver_data", exchange_data)

                pass
            except urllib.error.HTTPError as e:
                self.x0h_output.setHtml('The server couldn\'t fulfill the request.\nError Code: '
                                        + str(e.code) + "\n\n" +
                                        server.BaseHTTPRequestHandler.responses[e.code][1])
                raise e

            except urllib.error.URLError as e:
                self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                        + e.reason)
                raise e

            except XrayServerException as e:
                ShowHtmlDialog.show_html("X-ray Server Error", e.response, width=750, height=500, parent=self)

                raise e
            except Exception as e:
                self.x0h_output.setHtml('We failed to reach a server.\nReason: '
                                        + str(e))

                raise e


            self.setStatusMessage("")
            self.progressBarFinished()

    def clear_response(self, response):

        print(response)

        # remove links
        output = response.split("<img src=\"images/x.gif\" width=\"31\" height=\"32\" border=\"0\">")[0] + "\n</body></html>"

        # remove "get the curve" images
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the reflectivity curve\">"))
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (sigma)\">"))
        output = "".join(output.split("<input type=image src=\"images/get_the_curve.gif\" border=0 width=102 height=12 alt=\"Get the Bragg curve (pi)\">"))
        # remove question mark images and links
        output = "".join(output.split("<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_0.gif\',\'x0h_0\',740,357);\"><b>?</b></a> &nbsp;"))
        output = "".join(output.split("<a  href=\"javascript:void(0)\" onClick=\"Wfloat(\'images/x0h_help_h.gif\',\'x0h_h\',705,853);\"><b>?</b></a> &nbsp;"))

        temp_1, temp_2 = output.split("style.css")
        output = temp_1 + XRAY_SERVER_URL + "/style.css" + temp_2

        return output

    def extract_plots(self, response):
        form_1_begin = False
        form_2_begin = False
        form_3_begin = False

        form_1 = None
        form_2 = None
        form_3 = None

        rows = response.split("\n")

        for row in rows:
            if form_1_begin:
                if "<td>" in row:
                    form_1_begin = False
            elif form_2_begin:
                if "<td>" in row:
                    form_2_begin = False
            elif form_3_begin:
                if "<td>" in row:
                    form_3_begin = False

            if form_1_begin:
                form_1.append(row)
            elif form_2_begin:
                form_2.append(row)
            elif form_3_begin:
                form_3.append(row)

            if "/cgi/ter_form.pl" in row:
                if form_1 is None:
                    form_1 = []
                    form_1_begin = True

            if "/cgi/gid_form.pl" in row:
                if form_2 is None:
                    form_2 = []
                    form_2_begin = True
                elif form_3 is None:
                    form_3 = []
                    form_3_begin = True

        self.setStatusMessage("Plotting Results")

        if not form_1 is None:
            x_1, y_1 = self.get_plots_from_form("/cgi/ter_form.pl", form_1)

            self.plot_histo(x_1, y_1, 40, 1, 0, "Critical Angle for TER", "Incidence angle [degrees]", "Reflectivity")
            self.tabs_widget.setCurrentIndex(1)
        else:
            x_1 = None
            y_1 = None
            
        if not form_2 is None:
            x_2, y_2 = self.get_plots_from_form("/cgi/gid_form.pl", form_2)

            self.plot_histo(x_2, y_2, 60, 2, 1, "Darwin Curve ($\sigma$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(2)
        else:
            x_2 = None
            y_2 = None

        if not form_3 is None:
            x_3, y_3 = self.get_plots_from_form("/cgi/gid_form.pl", form_3)

            self.plot_histo(x_3, y_3, 80, 3, 2, "Darwin Curve ($\pi$ Pol.)", "Scan Angle [arcsec]", "Diffracted Intensity")
            self.tabs_widget.setCurrentIndex(3)
        else:
            x_3 = None
            y_3 = None

        return [x_1, y_1], [x_2, y_2], [x_3, y_3]
コード例 #34
0
ファイル: syncthingui.py プロジェクト: coolshou/syncthingui
class MainWindow(QMainWindow):

    """Main window class."""

    def __init__(self):
        """Init class."""
        super(MainWindow, self).__init__()
        self.pixmap_syncthingui = QPixmap(":/images/syncthingui.svg")
        tf = QTransform()
        self.pixmap_syncthingui0 = QPixmap(":/images/syncthingui.svg")
        tf.rotate(90.0)
        self.pixmap_syncthingui1 = self.pixmap_syncthingui0.transformed(tf)
        tf.rotate(180.0)
        self.pixmap_syncthingui2 = self.pixmap_syncthingui0.transformed(tf)
        tf.rotate(270.0)
        self.pixmap_syncthingui3 = self.pixmap_syncthingui0.transformed(tf)

        self.init_gui()
        self.init_menu()
        self.init_systray()

        self.run()

    def init_gui(self):
        """init gui setup"""
        self.setWindowIcon(QIcon(self.pixmap_syncthingui))

        self.progressbar = QProgressBar()
        self.statusBar().showMessage(getoutput(SYNCTHING + ' --version'))
        self.statusBar().addPermanentWidget(self.progressbar)
        self.setWindowTitle(__doc__.strip().capitalize())
        self.setMinimumSize(900, 600)
        self.setMaximumSize(1280, 1024)
        self.resize(self.minimumSize())
        self.center()

        # QWebView
        # self.view = QWebView(self)
        self.view = QWebEngineView(self)
        self.view.loadStarted.connect(self.start_loading)
        self.view.loadFinished.connect(self.finish_loading)
        self.view.loadProgress.connect(self.loading)
        self.view.titleChanged.connect(self.set_title)
        self.view.page().linkHovered.connect(
            lambda link_txt: self.statusBar().showMessage(link_txt[:99], 3000))
        QShortcut("Ctrl++", self, activated=lambda:
                  self.view.setZoomFactor(self.view.zoomFactor() + 0.2))
        QShortcut("Ctrl+-", self, activated=lambda:
                  self.view.setZoomFactor(self.view.zoomFactor() - 0.2))
        QShortcut("Ctrl+0", self, activated=lambda: self.view.setZoomFactor(1))
        QShortcut("Ctrl+q", self, activated=lambda: self.close())

        # syncthing console
        self.consolewidget = QWidget(self)
        # TODO: start at specify (w,h)
        self.consolewidget.setMinimumSize(QSize(200, 100))
        # TODO: setStyleSheet
        # self.consolewidget.setStyleSheet("margin:0px; padding: 0px; \
        # border:1px solid rgb(0, 0, 0);")
        # border-radius: 40px;")
        # TODO read syncthing console visible from setting
        # self.consolewidget.setVisible(False)
        # self.consolewidget.showEvent
        # self.consoletextedit = QPlainTextEdit(parent=self.consolewidget)
        self.consoletoolbar = QWidget(self)
        hlayout = QHBoxLayout()
        hlayout
        self.consoletoolbar.setLayout(hlayout)
        self.consoletextedit = QTextEdit(parent=self.consolewidget)
        self.consoletextedit.setWordWrapMode(QTextOption.NoWrap)
        # self.consoletextedit.setStyleSheet(" border:1px solid rgb(0, 0, 0);")
        # self.consoletextedit.setStyleSheet("margin:0px; padding: 0px;")
        layout = QVBoxLayout()
        layout.addWidget(self.consoletoolbar)
        layout.addWidget(self.consoletextedit)

        self.consolewidget.setLayout(layout)

        self.splitter = QSplitter(Qt.Vertical)
        self.splitter.addWidget(self.view)
        self.splitter.addWidget(self.consolewidget)

        # process
        self.process = QProcess()
        self.process.error.connect(self._process_failed)
        # QProcess emits `readyRead` when there is data to be read
        self.process.readyRead.connect(self._process_dataReady)
        self.process.stateChanged.connect(self._process_stateChanged)
        # Just to prevent accidentally running multiple times
    # Disable the button when process starts, and enable it when it finishes
    # self.process.started.connect(lambda: self.runButton.setEnabled(False))
    # self.process.finished.connect(lambda: self.runButton.setEnabled(True))

        # backend options
        self.chrt = QCheckBox("Smooth CPU ", checked=True)
        self.ionice = QCheckBox("Smooth HDD ", checked=True)
        self.chrt.setToolTip("Use Smooth CPUs priority (recommended)")
        self.ionice.setToolTip("Use Smooth HDDs priority (recommended)")
        self.chrt.setStatusTip(self.chrt.toolTip())
        self.ionice.setStatusTip(self.ionice.toolTip())
        # main toolbar
        self.toolbar = self.addToolBar("SyncthinGUI Toolbar")
        # self.toolbar.addAction(QIcon.fromTheme("media-playback-stop"),
        self.toolbar.addAction(QIcon(":/images/stop.svg"),
                               "Stop Sync", lambda: self.syncthing_stop())
        # self.toolbar.addAction(QIcon.fromTheme("media-playback-start"),
        self.toolbar.addAction(QIcon(":/images/start.svg"),
                               "Restart Sync", lambda: self.run())
        self.toolbar.addSeparator()
        self.toolbar.addWidget(self.chrt)
        self.toolbar.addWidget(self.ionice)
        self.toolbar.addSeparator()
        # TODO: test event API
        self.toolbar.addAction(QIcon(":/images/start.svg"),
                               "test ", lambda: self.test())

        # final gui setup
        self.setCentralWidget(self.splitter)

    def test(self):
        """ test some function """
        print("test")

    def init_menu(self):
        """init menu setup"""
        # file menu
        file_menu = self.menuBar().addMenu("File")
        # TODO: setting menu item
        file_menu.addAction("Exit", lambda: self.close())
        # Syncthing menu
        sync_menu = self.menuBar().addMenu("Syncthing")
        sync_menu.addAction("Start Syncronization", lambda: self.run())
        sync_menu.addAction("Stop Syncronization",
                            lambda: self.syncthing_stop())
        # TODO: restart
        # TODO: reflash F5
        sync_menu.addAction("Open in external browser",
                            lambda: open_new_tab(URL))

        # view menu
        view_menu = self.menuBar().addMenu("View")
        # TODO: syncthing console menu
        view_menu.addAction("syncthing console", lambda: self.show_console)
        #
        zoom_menu = view_menu.addMenu("Zoom browser")
        zoom_menu.addAction(
            "Zoom In",
            lambda: self.view.setZoomFactor(self.view.zoomFactor() + .2))
        zoom_menu.addAction(
            "Zoom Out",
            lambda: self.view.setZoomFactor(self.view.zoomFactor() - .2))
        zoom_menu.addAction(
            "Zoom To...",
            lambda: self.view.setZoomFactor(QInputDialog.getInt(
                self, __doc__, "<b>Zoom factor ?:", 1, 1, 9)[0]))
        zoom_menu.addAction("Zoom Reset", lambda: self.view.setZoomFactor(1))
        view_menu.addSeparator()
        act = view_menu.addAction("View Page Source",
                                  lambda: self.view_syncthing_source)
        act.setDisabled(True)

        # window menu
        window_menu = self.menuBar().addMenu("&Window")
        window_menu.addAction("Minimize", lambda: self.showMinimized())
        window_menu.addAction("Maximize", lambda: self.showMaximized())
        window_menu.addAction("Restore", lambda: self.showNormal())
        window_menu.addAction("Center", lambda: self.center())
        window_menu.addAction("Top-Left", lambda: self.move(0, 0))
        window_menu.addAction("To Mouse",
                              lambda: self.move_to_mouse_position())
        window_menu.addAction("Fullscreen", lambda: self.showFullScreen())
        window_menu.addSeparator()
        window_menu.addAction("Increase size", lambda: self.resize(
            self.size().width() * 1.2, self.size().height() * 1.2))
        window_menu.addAction("Decrease size", lambda: self.resize(
            self.size().width() // 1.2, self.size().height() // 1.2))
        window_menu.addAction("Minimum size", lambda:
                              self.resize(self.minimumSize()))
        window_menu.addAction("Maximum size", lambda:
                              self.resize(self.maximumSize()))
        window_menu.addAction("Horizontal Wide", lambda: self.resize(
            self.maximumSize().width(), self.minimumSize().height()))
        window_menu.addAction("Vertical Tall", lambda: self.resize(
            self.minimumSize().width(), self.maximumSize().height()))
        window_menu.addSeparator()
        window_menu.addAction("Disable Resize",
                              lambda: self.setFixedSize(self.size()))
        # help menu
        help_menu = self.menuBar().addMenu("&Help")
        help_menu.addAction("Support Forum", lambda: open_new_tab(HELP_URL_0))
        help_menu.addAction("Lastest Release",
                            lambda: open_new_tab(HELP_URL_1))
        help_menu.addAction("Documentation", lambda: open_new_tab(HELP_URL_2))
        help_menu.addAction("Bugs", lambda: open_new_tab(HELP_URL_3))
        help_menu.addAction("Source Code", lambda: open_new_tab(HELP_URL_4))
        help_menu.addSeparator()
        help_menu.addAction("About Qt 5", lambda: QMessageBox.aboutQt(self))
        help_menu.addAction("About Python 3",
                            lambda: open_new_tab('https://www.python.org'))
        help_menu.addAction("About " + __doc__,
                            lambda: QMessageBox.about(self, __doc__, HELPMSG))
        help_menu.addSeparator()
        help_menu.addAction("Keyboard Shortcuts", lambda:
                            QMessageBox.information(self, __doc__, SHORTCUTS))
        help_menu.addAction("View GitHub Repo", lambda: open_new_tab(__url__))
        if not sys.platform.startswith("win"):
            help_menu.addAction("Show Source Code", lambda: self.view_source())
        help_menu.addSeparator()
        help_menu.addAction("Check Updates", lambda: self.check_for_updates())

    def init_systray(self):
        """init system tray icon"""
        # self.tray = QSystemTrayIcon(QIcon(self.pixmap_syncthingui), self)
        self.tray = AnimatedSysTrayIcon(QIcon(self.pixmap_syncthingui), self)
        self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui0))
        self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui1))
        self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui2))
        self.tray.add_ani_icon(QIcon(self.pixmap_syncthingui3))

        self.tray.setToolTip(__doc__.strip().capitalize())
        traymenu = QMenu(self)
        traymenu.addAction(__doc__).setDisabled(True)
        traymenu.addSeparator()
        # to test animate
        # traymenu.addAction("start", lambda: self.tray.animate_start())
        # traymenu.addAction("stop", lambda: self.tray.animate_stop())
        # traymenu.addSeparator()
        traymenu.addAction("Stop Sync", lambda: self.syncthing_stop())
        traymenu.addAction("Restart Sync", lambda: self.run())
        traymenu.addSeparator()
        traymenu.addAction("Show", lambda: self.show_gui())
        traymenu.addAction("Hide", lambda: self.hide())
        traymenu.addSeparator()
        # traymenu.addAction("Open Web", lambda: open_new_tab(URL))
        # traymenu.addAction("Quit All", lambda: self.close())
        traymenu.addAction("Quit All", lambda: self.app_exit())
        self.tray.setContextMenu(traymenu)
        self.tray.show()

    def show_gui(self):
        """
        Helper method to show UI, this should not be needed, but I discovered.
        """
        self.showNormal()
        # webview require 70Mb to show webpage
        self.view.load(QUrl(URL))

    def syncthing_start(self):
        """syncthing start"""
        self.run()

    def syncthing_stop(self):
        """syncthing stop"""
        print("try to stop syncthing")
        self.process.kill()
        # check there is no other syncthing is running!
        for proc in psutil.process_iter():
            # check whether the process name matches
            # print("procress: %s " % proc.name())
            if proc.name() == SYNCTHING:
                proc.kill()

    def run(self):
        """Run bitch run!."""
        # Stop first!
        self.syncthing_stop()

        command_to_run_syncthing = " ".join((
            "ionice --ignore --class 3" if self.ionice.isChecked() else "",
            "chrt --verbose --idle 0" if self.chrt.isChecked() else "",
            SYNCTHING, "-no-browser"))
        print(command_to_run_syncthing)
        self.process.start(command_to_run_syncthing)
        if not self.process.waitForStarted():
            self._process_failed()

    @pyqtSlot()
    def _process_failed(self):
        """Read and return errors."""
        self.statusBar().showMessage("ERROR:Fail:Syncthing blow up in pieces!")
        print("ERROR:Fail:Syncthing blow up in pieces! Wheres your God now?")
        return str(self.process.readAllStandardError()).strip().lower()

    @pyqtSlot()
    def _process_dataReady(self):
        """get process stdout/strerr when data ready"""
        # TODO: format the msg to remove extra b and \n
        msg = str(self.process.readAll())
        lines = msg.split("'")
        tmp = lines[1]
        tmp = tmp.splitlines(0)
        lines = tmp[0].split("\\n")
        for line in lines:
            if line != "":
                # print("1: %s" % line)
                self.consoletextedit.append(line)
        self.consoletextedit.ensureCursorVisible()
        # autoscroll to last line's first character
        self.consoletextedit.moveCursor(QTextCursor.End)
        self.consoletextedit.moveCursor(QTextCursor.StartOfLine)

    @pyqtSlot(QProcess.ProcessState)
    def _process_stateChanged(self, state):
        """ procress_stateChanged """
        # TODO handle procress_stateChanged
        print("procress_stateChanged: %s" % state)

    def center(self):
        """Center Window on the Current Screen,with Multi-Monitor support."""
        window_geometry = self.frameGeometry()
        mousepointer_position = QApplication.desktop().cursor().pos()
        screen = QApplication.desktop().screenNumber(mousepointer_position)
        centerpoint = QApplication.desktop().screenGeometry(screen).center()
        window_geometry.moveCenter(centerpoint)
        self.move(window_geometry.topLeft())

    def move_to_mouse_position(self):
        """Center the Window on the Current Mouse position."""
        window_geometry = self.frameGeometry()
        window_geometry.moveCenter(QApplication.desktop().cursor().pos())
        self.move(window_geometry.topLeft())

    def show_console(self):
        """Show syncthing console"""
        visible = not self.consolewidget.isVisible
        print("bVisible: %s" % visible)
        self.consolewidget.setVisible(True)
        self.consolewidget.resize(QSize(200, 100))

    def view_source(self):
        """ TODO: Call methods to load and display source code."""
        # call(('xdg-open ' if sys.platform.startswith("linux") else 'open ')
        #      + __file__, shell=True)
        pass

    def view_syncthing_source(self):
        """Call methods to load and display web page source code."""
        print("view_syncthing_source start")
        # access_manager = self.view.page().networkAccessManager()
        # reply = access_manager.get(QNetworkRequest(self.view.url()))
        # reply.finished.connect(self.slot_source_downloaded)

    def slot_source_downloaded(self):
        """Show actual page source code."""
        reply = self.sender()
        # TODO: highlight html source editor/viewer
        self.textedit = QPlainTextEdit()
        self.textedit.setAttribute(Qt.WA_DeleteOnClose)
        self.textedit.setReadOnly(True)
        self.textedit.setPlainText(QTextStream(reply).readAll())
        self.textedit.show()
        reply.deleteLater()

    @pyqtSlot()
    def start_loading(self):
        """show progressbar when downloading data"""
        self.progressbar.show()

    @pyqtSlot(bool)
    def finish_loading(self, finished):
        """Finished loading content."""
        if not finished:
            # TODO: When loading fail, what should we do?
            print("load fail")
            if self.process.state() == QProcess.NotRunning:
                self.run()
                self.view.reload()
            # if self.process.state != QProcess.Running:
            #    print("syncthing is not running: %s" % self.process.state())
            # pass
        print("finish_loading: %s" % finished)
        # TODO: WebEngineView does not have following function?
        # self.view.settings().clearMemoryCaches()
        # self.view.settings().clearIconDatabase()

        # print("finish_loading %s" % datetime.strftime(datetime.now(),
        #                                              '%Y-%m-%d %H:%M:%S'))
        # TODO: following line need 6 sec to finish!!
        # TODO: (" INFO: Loading Web UI increases >250Mb RAM!.")
        # self.view.page().mainFrame().evaluateJavaScript(BASE_JS)
        # print("finish_loading %s" % datetime.strftime(datetime.now(),
        #                                             '%Y-%m-%d %H:%M:%S'))
        self.progressbar.hide()

    @pyqtSlot(int)
    def loading(self, idx):
        """loading content"""
        #print("loading %s" % idx)
        self.progressbar.setValue(idx)

    @pyqtSlot(str)
    def set_title(self, title):
        """set title when webview's title change"""
        # print("title: %s" % title)
        if len(title.strip()) > 0:
            self.setWindowTitle(self.view.title()[:99])

    def check_for_updates(self):
        """Method to check for updates from Git repo versus this version."""
        # print("TODO: https://github.com/coolshou/syncthingui/releases/latest")

        print("__version__: %s" % __version__)
        '''
        this_version = str(open(__file__).read())
        print("this_version: %s" % this_version)
        last_version = str(request.urlopen(__source__).read().decode("utf8"))
        print("last_version: %s" % last_version)

        TODO: previous use file compare, when diff then there is new file!!
        if this_version != last_version:
            m = "Theres new Version available!<br>Download update from the web"
        else:
            m = "No new updates!<br>You have the lastest version of" + __doc__
        return QMessageBox.information(self, __doc__.title(), "<b>" + m)
'''
    def closeEvent(self, event):
        """Ask to Quit."""
        if self.tray.isVisible():
            if self.tray.supportsMessages():
                self.tray.showMessage("Info",
                                      "The program will keep running in the "
                                      "system tray. To terminate the program,"
                                      " choose <b>Quit</b> in the context "
                                      "menu of the system tray entry.")
            else:
                print(" System tray not supports balloon messages ")
            self.hide()
            event.ignore()

    def app_exit(self):
        """exit app"""
        # TODO: do we need to show UI when doing close?
        # self.show_gui()
        # TODO: show QMessageBox on all virtual desktop
        the_conditional_is_true = QMessageBox.question(
            self, __doc__.title(), 'Quit %s?' % __doc__,
            QMessageBox.Yes | QMessageBox.No,
            QMessageBox.No) == QMessageBox.Yes
        if the_conditional_is_true:
            self.syncthing_stop()
            self.ani_stop = True
            QApplication.instance().quit
            quit()
コード例 #35
0
ファイル: BrowserWindow.py プロジェクト: Waldteufel/shower
class BrowserWindow(QWidget):

    urlChanged = pyqtSignal()

    def __init__(self, svc, url='', windowType=QWebEnginePage.WebBrowserWindow, isLatent=False):
        super().__init__()
        self.svc = svc
        self.hoveredUrl = ''
        self.isLatent = isLatent
        self.isLoading = False
        self.nextUrl = QUrl('')
        self.initUI(windowType)
        if url != '':
            self.cmdLine.setText(url)
            self.handleCommand()
        else:
            self.beginEnteringCommand(None)

    def beginEnteringCommand(self, cmd):
        self.cmdLine.setFocus(Qt.OtherFocusReason)
        if cmd is None:
            self.cmdLine.setText(self.webView.page().url().toDisplayString())
            self.cmdLine.selectAll()
        else:
            self.cmdLine.setText(cmd)

    def handleCommand(self):
        cmd = self.cmdLine.text()
        if cmd.startswith('?'):
            self.webView.page().load(QUrl('https://duckduckgo.com/?q=' + cmd[1:].strip()))
        elif cmd.startswith('/'):
            self.webView.page().findText(cmd[1:].strip())
        else:
            url = urlparse(cmd)
            if url.scheme == '':
                url = url._replace(scheme='https')
            self.webView.page().load(QUrl(url.geturl()))

    def toggleSource(self):
        url = self.webView.page().url().toDisplayString()
        if url == '': return
        prefix = 'view-source:'
        if url.startswith(prefix):
            url = url[len(prefix):]
        else:
            url = prefix + url
        self.webView.page().load(QUrl(url))

    @pyqtSlot(str)
    def onLinkHovered(self, url):
        self.hoveredUrl = url
        self.urlChanged.emit()

    def url(self):
        if self.isLoading:
            return self.nextUrl
        else:
            return self.webView.page().url()

    @pyqtSlot()
    def onUrlChanged(self):
        if self.hoveredUrl != '':
            self.urlLabel.setText('<span style="color: gray">{}</span>'.format(html.escape(self.hoveredUrl)))
        else:
            self.urlLabel.setText(html.escape(self.url().toDisplayString()))

    @pyqtSlot()
    def onTitleChanged(self):
        title = self.webView.page().title()
        if title == '':
            self.setWindowTitle('shower')
        else:
            self.setWindowTitle('shower: ' + title)

    def addShortcut(self, key, handler):
        shortcut = QShortcut(QKeySequence(key), self)
        shortcut.activated.connect(handler)
        return shortcut

    @pyqtSlot()
    def onLoadStarted(self):
        self.isLoading = True
        self.stopShortcut.setEnabled(True)
        self.progressLabel.setText('<span style="color: yellow">[ 0%]</span>')

    @pyqtSlot(int)
    def onLoadProgress(self, n):
        if n == 100:
            self.progressLabel.setText('<span style="color: green">[100]</span>'.format(n))
        else:
            self.progressLabel.setText('<span style="color: yellow">[{:2d}%]</span>'.format(n))

    @pyqtSlot()
    def onLoadFinished(self):
        self.isLoading = False
        self.stopShortcut.setEnabled(False)
        self.urlChanged.emit()

    def initUI(self, windowType):
        self.setStyleSheet("""
            #cmdLine, #bar, #bar > * { border: 0px; background: #070707; font-family: "Pro Font"; font-size: 10px; color: white; min-height: 17px }
        """)

        self.setWindowTitle('shower')
        self.setAttribute(Qt.WA_DeleteOnClose)

        vbox = QVBoxLayout()
        self.setLayout(vbox)
        vbox.setContentsMargins(0, 0, 0, 0)
        vbox.setSpacing(0)

        bar = QWidget()
        bar.setObjectName('bar')
        hbox = QHBoxLayout()
        hbox.setContentsMargins(2, 0, 0, 0)
        hbox.setSpacing(0)
        bar.setLayout(hbox)
        vbox.addWidget(bar)

        self.urlLabel = QLabel()
        self.urlLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Preferred)
        self.urlLabel.setTextFormat(Qt.RichText)
        hbox.addWidget(self.urlLabel)
        hbox.setStretch(0, 1)

        self.progressLabel = QLabel()
        self.progressLabel.setTextFormat(Qt.RichText)
        hbox.addWidget(self.progressLabel)

        self.cmdLine = QLineEdit()
        self.cmdLine.setObjectName('cmdLine')
        vbox.addWidget(self.cmdLine)

        self.webView = QWebEngineView()
        self.webView.setPage(BrowserPage(self))
        vbox.addWidget(self.webView)

        self.cmdLine.returnPressed.connect(self.handleCommand)

        self.webView.page().linkHovered.connect(self.onLinkHovered)
        self.webView.page().urlChanged.connect(self.urlChanged)
        self.webView.page().titleChanged.connect(self.onTitleChanged)
        self.webView.page().loadProgress.connect(self.onLoadProgress)
        self.webView.page().loadStarted.connect(self.onLoadStarted)
        self.webView.page().loadFinished.connect(self.onLoadFinished)

        self.urlChanged.connect(self.onUrlChanged)

        self.addShortcut("Alt+Left", lambda: self.webView.page().triggerAction(QWebEnginePage.Back))
        self.addShortcut("Alt+Right", lambda: self.webView.page().triggerAction(QWebEnginePage.Forward))
        self.addShortcut("Ctrl+R", lambda: self.webView.page().triggerAction(QWebEnginePage.Reload))
        self.addShortcut("Ctrl+Shift+R", lambda: self.webView.page().triggerAction(QWebEnginePage.ReloadAndBypassCache))
        self.stopShortcut = self.addShortcut("Esc", lambda: self.webView.page().triggerAction(QWebEnginePage.Stop))
        self.addShortcut("Ctrl+W", lambda: self.close())
        self.addShortcut("Ctrl+L", lambda: self.beginEnteringCommand(None))
        self.addShortcut("Ctrl+K", lambda: self.beginEnteringCommand('? '))
        self.addShortcut("Ctrl+/", lambda: self.beginEnteringCommand('/ '))
        self.addShortcut("Ctrl+U", lambda: self.toggleSource())
コード例 #36
0
class HelpDialog(QObject, LogMixin):
    """Class implementing qthelp viewer dialog"""

    def __init__(self, qthelp_file, parent = None):
        """
        Constructor of HelpDialog

        :param qthelp_file: full path to qthelp helpfile

        """
        super(HelpDialog,self).__init__(parent)

        # instantiate help engine

        helpEngine = QHelpEngine(qthelp_file)
        helpEngine.setupData()
        self._helpEngine = helpEngine

        # base dialog widget
        self.ui = QDialog(None, QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinMaxButtonsHint | QtCore.Qt.WindowCloseButtonHint )

        self.ui.setWindowTitle("HelpViewer")
        self.ui.setWindowIcon(QIcon(":/images/prog_icons/help/help.ico"))

        # Create webview for help information
        # and assign a custom URL scheme handler for scheme "qthelp)

        self._wv = QWebEngineView(self.ui)
        self._urlschemehandler = HelpSchemeHandler(self._helpEngine, self._wv.page().profile())
        self._wv.page().profile().installUrlSchemeHandler(b'qthelp', self._urlschemehandler)

        # get help content overview widget
        self._helpContent = self._helpEngine.contentWidget()
        self._helpIndex = self._helpEngine.indexWidget()
        self._helpSearchQuery = self._helpEngine.searchEngine().queryWidget()
        self._helpSearchResult = self._helpEngine.searchEngine().resultWidget()
        self._se = self._helpEngine.searchEngine()
        self._se.reindexDocumentation()

        self._helpSearchQuery.search.connect(self.search)

        # create QSplitter
        self._splitterMain = QSplitter(QtCore.Qt.Vertical)
        self._splitterMain.setOpaqueResize(False)
        self._splitterSearch = QSplitter(QtCore.Qt.Horizontal)
        self._splitterSearch.setOpaqueResize(False)
        self._splitterUpper = QSplitter(QtCore.Qt.Horizontal)
        self._splitterUpper.setOpaqueResize(False)
        self._splitterLower = QSplitter(QtCore.Qt.Horizontal)
        self._splitterLower.setOpaqueResize(False)

        # create horzLayout
        self._horzLayoutSearch = QHBoxLayout()
        self._horzLayoutUpper = QHBoxLayout()
        self._horzLayoutLower = QHBoxLayout()
        # create vertLayout
        self._vertLayout = QVBoxLayout()

        # main widgets
        self._upperWidget = QWidget()
        self._lowerWidget = QWidget()
        self._btnReset = QPushButton()
        self._btnReset.setMaximumHeight(23)
        self._btnReset.setMaximumWidth(100)

        # build search structure
        self._splitterSearch.insertWidget(0, self._helpSearchQuery)
        self._splitterSearch.insertWidget(1, self._btnReset)

        # build upper inner structure
        self._splitterUpper.insertWidget(0, self._helpContent)
        self._splitterUpper.insertWidget(1, self._wv)
        self._horzLayoutUpper.addWidget(self._splitterUpper)
        self._upperWidget.setLayout(self._horzLayoutUpper)

        # build lower inner structure
        self._splitterLower.insertWidget(0, self._helpIndex)
        self._splitterLower.insertWidget(1, self._helpSearchResult)
        self._horzLayoutLower.addWidget(self._splitterLower)
        self._lowerWidget.setLayout(self._horzLayoutLower)

        # build outer structure
        self._splitterMain.insertWidget(0, self._splitterSearch)
        self._splitterMain.insertWidget(1, self._upperWidget)
        self._splitterMain.insertWidget(2, self._lowerWidget)

        self._helpSearchResult.hide()
        self._btnReset.hide()

        self._vertLayout.addWidget(self._splitterMain)
        self.ui.setLayout(self._vertLayout)

        # set splitter width
        w = self._splitterUpper.geometry().width()
        self._splitterUpper.setSizes([w*(1/4), w*(3/4)])
        w = self._splitterLower.geometry().width()
        self._splitterLower.setSizes([w*(1/5), w*(4/5)])
        h = self._splitterMain.geometry().height()
        self._splitterMain.setSizes([h*(1/9), h*(7/9), h*(1/9)])

        self._helpContent.linkActivated.connect(self._wv.setUrl)
        self._helpIndex.linkActivated.connect(self._wv.setUrl)
        self._helpSearchResult.requestShowLink.connect(self._wv.setUrl)
        self._se.searchingFinished.connect(self.showResults)
        self._btnReset.clicked.connect(self.resetResult)

        self.retranslateMsg()

    def retranslateMsg(self):
        self.logger.debug("Retranslating further messages...")
        self._btnReset.setText(translate("HelpViewer", "Reset"))
        self._btnReset.setText(translate("HelpViewer", "Search"))

    def search(self):
        """Initiate qthelp search"""

        self._se.search(self._helpSearchQuery.query())

    def showResults(self):
        """Show search results, if any"""

        if self._se.hitCount() > 0:
            self._helpIndex.hide()
            h = self._splitterMain.geometry().height()
            self._splitterMain.setSizes([h*(1/3), h*(1/3), h*(1/3)])
            self._helpSearchResult.show()
            self._btnReset.show()

    def resetResult(self):
        """Reset search result widget"""

        self._helpSearchResult.hide()
        self._btnReset.hide()
        self._helpIndex.show()
        h = self._splitterMain.geometry().height()
        self._splitterMain.setSizes([h*(1/9), h*(7/9), h*(1/9)])
コード例 #37
0
ファイル: qt502_webviewJs02.py プロジェクト: kiorry/PYQT
from PyQt5.QtWebChannel import  QWebChannel 
import sys


# 创建一个 application实例
app = QApplication(sys.argv)
win = QWidget()
win.setWindowTitle('Web页面中的JavaScript与 QWebEngineView交互例子')

# 创建一个垂直布局器
layout = QVBoxLayout()
win.setLayout(layout)

# 创建一个 QWebEngineView 对象
view =  QWebEngineView()
htmlUrl = 'http://127.0.0.1:8020/web/index.html'
view.load( QUrl( htmlUrl ))

# 创建一个 QWebChannel对象,用来传递pyqt参数到JavaScript
channel =  QWebChannel( )
myObj = MySharedObject()   
channel.registerObject( "bridge", myObj )  
view.page().setWebChannel(channel)
 
# 把QWebView和button加载到layout布局中
layout.addWidget(view)
           
# 显示窗口和运行app
win.show()
sys.exit(app.exec_())
コード例 #38
0
ファイル: DrrrChatRoom.py プロジェクト: xin053/DrrrClient
class DrrrWindow(ShadowsWindow):
    def __init__(self):
        super(DrrrWindow, self).__init__()
        self.setWindowTitle("Drrr Chat Room")
        self.setWindowIcon(QIcon('./img/drrr.ico'))

        # w = WebView()
        # w.show()
        self.getSetting()

        self.WebView = QWebEngineView()
        # self.WebView.load(QUrl("file:///E:/Project/DrrrPC/img/index.html"))
        self.WebView.setZoomFactor(0.8)

        # 设置加载网页,和网页加载完成以及加载过程信号与槽函数关联
        self.WebView.loadStarted.connect(self.loadStarted)
        self.WebView.loadFinished.connect(self.loadFinished)
        self.WebView.loadProgress.connect(self.loading)

        self.cookieJar = QNetworkCookieJar()
        # self.WebView.page().networkAccessManager().setCookieJar(self.cookieJar)
        # self.WebView.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        # self.WebView.page().linkClicked.connect(self.linkClicked)
        # self.WebView.page().contentsChanged.connect(self.contentsChanged)
        # self.WebView.page().networkAccessManager().setHeader(QNetworkRequest.ContentTypeHeader, QVariant("text/html; charset=GBK"))


        # 重定义QWebEnginePage中javaScriptAlert等函数
        self.WebView.page().javaScriptAlert = self._javascript_alert                
        self.WebView.page().javaScriptConsoleMessage = self._javascript_console_message
        self.WebView.page().javaScriptConfirm = self._javascript_confirm
        self.WebView.page().javaScriptPrompt = self._javascript_prompt

        # NetworkAccessManager
        # self.NetworkAccessManager = QNetworkAccessManager()
        # self.WebView.page().setNetworkAccessManager(self.NetworkAccessManager)
        # self.NetworkAccessManager.finished.connect(self.NetworkAccessManagerReplyFinished)        
        # self.NetworkAccessManager.get(QNetworkRequest(QUrl("http://www.baidu.com")))        

        # self.old_manager = self.WebView.page().networkAccessManager()
        # self.new_manager = NetworkAccessManager(self.old_manager)
        # self.WebView.page().setNetworkAccessManager(self.new_manager)

        self.titlebar = titleBar()
        self.statusBar = StatusWindow()

        # 中心窗口布局
        self.contentLayout = QVBoxLayout()
        self.contentWidget = QWidget()
        self.contentWidget.gridLayout = QtWidgets.QGridLayout(self.contentWidget)
        self.contentWidget.gridLayout.addLayout(self.contentLayout, 0, 0, 1, 1)
        self.contentLayout.addWidget(self.WebView)
        self.contentWidget.gridLayout.setContentsMargins(0,0,0,0)
        self.contentLayout.setContentsMargins(1,0,1,0)
        self.contentWidget.setStyleSheet("""
            border-left:    1px solid black;
            border-right:   1px solid black;
            """)

        # self.titlebar.titlebarBotton = QPushButton(self.titlebar)
        # self.titlebar.titlebarBotton.setText('Push ME')
        # self.titlebar.titlebarBotton.clicked.connect(self.getData)

        self.main_layout = QVBoxLayout()
        self.main_layout.addWidget(self.titlebar)
        self.main_layout.addWidget(self.contentWidget)
        self.main_layout.addWidget(self.statusBar)
        self.main_layout.setSpacing(0)

        # 窗口属性
        self.setWindowFlags(Qt.Widget | QtCore.Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_NoSystemBackground, True)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground,True)
        
        self.widget = QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(self.main_layout)
        self.widget.setMouseTracking(True)        
        # self.resize(500,650)
        self.resize(650,650)
        # self.setMaximumHeight(660)
        self.center()

        # 将三个按钮点击信号与相关槽函数相关联
        self.titlebar.min_button.clicked.connect(self.hideIt)
        self.titlebar.max_button.clicked.connect(self.MaxAndNormal)
        self.titlebar.close_button.clicked.connect(self.closeIt)

        # 状态栏进度条:将LoadProgress信号与loading槽函数相关联
        self.WebView.loadProgress.connect(self.loading)

        # notice sound
        # self.player = 

        self.WebView.setHtml(WaitingHTML)
        self.show()
        self.WebView.setStyleSheet("""
            QWebView {
                background-color:black
            }        
            QWebView::QScrollBar:Vertical {
                background-color:black
            }
            """)
        self.WebView.load(QUrl("http://drrr.com/"))

    def center(self,screenNum=0):
        '''多屏居中支持'''
        self.desktop = QApplication.desktop()
        screen = self.desktop.availableGeometry(screenNum)
        size = self.geometry()
        self.normalGeometry2 = QtCore.QRect((screen.width()-size.width())/2+screen.left(),
                         (screen.height()-size.height())/2,
                         size.width(),size.height())
        self.setGeometry((screen.width()-size.width())/2+screen.left(),
                         (screen.height()-size.height())/2,
                         size.width(),size.height())

    def keyPressEvent(self,event):
        # F11全屏切换
        if event.key()==QtCore.Qt.Key_F11:
            self.MaxAndNormal()
        if event.key()==QtCore.Qt.Key_F4:
            self.WebView.page().mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)

    def getData(self):
        # print self.bbb == None
        # print str(self.bbb)
        pass
        
    @QtCore.pyqtSlot(str)
    def play(self,content):
        # ["bubble","userin","userout"]
        print (content)
        QtMultimedia.QSound.play("./img/"+content+".wav")

    def readyRead(self):
        pass
        # print self.NetworkAccessManager.readAll()

    def NetworkAccessManagerReplyFinished(self,response):
        # NO USE
        # print response.readAll()
        # print response.header(QNetworkRequest.ContentTypeHeader)
        # print response.url()
        # self.bbb = response.readAll()
        response.deleteLater()

    def contentsChanged(self):
        # print 'contentsChanged'
        pass

    def _javascript_alert(self, webframe, message):
        print ('_javascript_alert')
        
    def _javascript_console_message(self, message, line, sourceid):
        print ("_javascript_console_message")

    def _javascript_confirm(self, webframe, message):
        print ("_javascript_confirm")
        return QWebPage.javaScriptConfirm(self.WebView.page(), webframe, message)

    def _javascript_prompt(self, webframe, message, defaultvalue, result):
        print ("_javascript_prompt")

    def linkClicked(self,url):
        print (url)

    # 获取ini格式的设置
    def getSetting(self):
        '''获取应用设置'''
        self.settings = QtCore.QSettings("DrrrChatRoom.ini", QtCore.QSettings.IniFormat)

    def loadStarted(self):
        if 'http://drrr.com/' == str(self.WebView.url().toString()):
            frame = self.WebView.page()
            # name = frame.findFirstElement("input#form-name.home-name-input")
            # username = name.evaluateJavaScript("this.value")
            # print (username)
            # language = frame.findFirstElement("#form-language-select")
            # language = language.evaluateJavaScript("this.value")
            # print (language)
            frame.runJavaScript("""
                var iconFun = function(){
                    var elementsLI = document.getElementsByTagName('li')
                    var length = document.getElementsByTagName('li').length;
                    for(var i = 0; i < length ; ++i){
                        if(elementsLI[i].getElementsByTagName('div')[0].className.indexOf("active")>=0){
                            var icon = elementsLI[i].getElementsByTagName('input')[0].value;
                        }                    
                    }
                    return icon
                    };                                
                """)
            icon = frame.runJavaScript("""iconFun()""")

            print (icon)

            # if username:self.settings.setValue('username',username)
            # if language:self.settings.setValue("language",language)
            # if icon:
            #     # self.settings.setValue("icon",icon)
            #     pass
            # else:
            #     if self.settings.value('icon', None):
            #         icon = self.settings.value('icon',None)
            #         frame.findFirstElement('input[value="'+icon+'"]').evaluateJavaScript("this.click()")
            #

        if "http://drrr.com/room/?ajax=1" in str(self.WebView.url().toString()):
            # print "quit room"
            pass
        print ('requestedUrl:' + self.WebView.url().toString())
    
    def loadFinished(self, flag):
        self.statusBar.status.setText(u"Connected")

        # http://drrr.com/
        if 'http://drrr.com/' == str(self.WebView.url().toString()):
            frame = self.WebView.page()
            # name = frame.findFirstElement("input#form-name.home-name-input")
            # if self.settings.value('username', None):
            #     name.setAttribute('value',self.settings.value('username', None))
            # language = frame.findFirstElement("#form-language-select")
            # if self.settings.value('language', None):
            #     language.evaluateJavaScript('''
            #         sel = document.getElementById("form-language-select");
            #         for(var i = 0, j = sel.options.length; i < j; ++i) {
            #             if(sel.options[i].value === "'''+self.settings.value('language', "zh-CN")+'''") {
            #                sel.selectedIndex = i;
            #                break;
            #             }
            #         }
            #         ''')
            #     # language.setAttribute('value',self.settings.value('language', None))
            # if self.settings.value('icon', None):
            #     icon = self.settings.value('icon',None)
            #     frame.findFirstElement('input[value="'+icon+'"]').evaluateJavaScript("this.click()")

        # http://drrr.com/create_room/
        if 'http://drrr.com/room/' in str(self.WebView.url().toString()):
            frame = self.WebView.page()
            # frame.addToJavaScriptWindowObject("drrrWindow", self)
            frame.runJavaScript('''
                var volumeFun = function(b){
                    return b
                    }
                ''')
            frame.runJavaScript('''
                var playFun = function(a){
                    this.volume = volumeFun;
                    drrrWindow.play(a);
                    return this
                    };
                ''')
            frame.runJavaScript('''sound.play = playFun''')
                                            
    def loading(self, percent):
        self.statusBar.status.setText("Loading %d%%" % percent)

    def quit(self):
        sys.exit(0)
        # QtCore.QCoreApplication.instance().quit()

    def closeIt(self):
        self.animation = QtCore.QPropertyAnimation(self,"windowOpacity")
        self.animation.finished.connect(QtCore.QCoreApplication.instance().quit)
        self.animation.finished.connect(self.quit)
        self.animation.setDuration(300)
        self.animation.setStartValue(1)
        self.animation.setEndValue(0)
        self.animation.start()

    def hideIt(self):
        self.animation = QtCore.QPropertyAnimation(self,"windowOpacity")
        self.animation.finished.connect(self.showMinimized2)
        self.animation.setDuration(300)
        self.animation.setStartValue(1)
        self.animation.setEndValue(0)
        self.animation.start()
    
    def leaveEvent(self,event):
        self.setCursor(QtCore.Qt.ArrowCursor)

    def keyPressEvent(self,event):
        # F11全屏切换
        if event.key()==QtCore.Qt.Key_F11:
            self.MaxAndNormal2()

    def MaxAndNormal2(self):
        '''全屏与正常大小间切换函数'''
        if self.showNormal3():
            self.showFullScreen3()
            self.titlebar.hide()
            self.statusBar.hide()
        else:
            self.titlebar.show()
            self.statusBar.show()            

    def MaxAndNormal(self):
        '''最大化与正常大小间切换函数'''
        if self.showNormal3():
            self.showFullScreen3()

    #定义DrrrWindow显示动画
    # def showEvent(self,event):
    #     self.animation = QtCore.QPropertyAnimation(self,"windowOpacity")
    #     self.animation.setDuration(300)
    #     self.animation.setStartValue(0)
    #     self.animation.setEndValue(1)
    #     self.animation.start()

    def showNormal2(self):
        self.showNormal()
        self.animationEndFlag = 1 # 动画停止

    def showNormal3(self):
        if self.isFullScreen():
            self.main_layout.setContentsMargins(10,7,10,7)
            self.animation = QtCore.QPropertyAnimation(self,"geometry")
            self.animation.setDuration(180)
            self.animation.setEndValue(self.normalGeometry2)
            self.animation.setStartValue(self.desktop.availableGeometry(self.desktop.screenNumber(self.widget)))
            self.animation.finished.connect(self.showNormal2)
            self.animationEndFlag = 0
            self.animation.start()
            return 0
        return 1

    def showFullScreen2(self):
        self.animationEndFlag = 1 # 动画停止
        self.showFullScreen()

    def showFullScreen3(self):
        if not self.isFullScreen():
            self.main_layout.setContentsMargins(0,0,0,0)
            self.animation = QtCore.QPropertyAnimation(self,"geometry")
            self.animation.setDuration(180)
            self.animation.setStartValue(self.geometry())
            self.animation.setEndValue(self.desktop.availableGeometry(self.desktop.screenNumber(self.widget)))
            self.animation.finished.connect(self.showFullScreen2)
            self.animationEndFlag = 0
            self.animation.start()

    def showMinimized2(self):
        self.setWindowOpacity(1)
        self.showMinimized()