{"id":25352,"date":"2024-06-04T19:33:59","date_gmt":"2024-06-04T10:33:59","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25352"},"modified":"2024-06-04T19:42:13","modified_gmt":"2024-06-04T10:42:13","slug":"python-web%e3%83%96%e3%83%a9%e3%82%a6%e3%82%b6","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25352","title":{"rendered":"python WEB\u30d6\u30e9\u30a6\u30b6"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>import sys\nimport os\nimport json\nfrom PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QWidget, QTabWidget, QAction, QMenuBar, QMenu, QListWidget, QInputDialog, QMessageBox, QFileDialog, QToolBar)\nfrom PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEngineDownloadItem\nfrom PyQt5.QtCore import QUrl, QTimer, Qt\n\nclass Browser(QMainWindow):\n    def __init__(self):\n        super().__init__()\n        self.setWindowTitle('Advanced Browser')\n        self.setGeometry(100, 100, 1200, 800)\n        \n        self.bookmarks = &#91;]\n        self.history = &#91;]\n        self.home_page = 'http:\/\/www.google.com'\n        self.auto_browse_url = ''\n        self.auto_browse_interval = 60\n        self.timer = QTimer(self)\n        self.timer.timeout.connect(self.auto_browse)\n\n        self.load_settings()\n\n        self.tab_widget = QTabWidget()\n        self.tab_widget.setDocumentMode(True)\n        self.tab_widget.tabBarDoubleClicked.connect(self.add_new_tab)\n        self.tab_widget.currentChanged.connect(self.update_url_bar)\n        self.tab_widget.setTabsClosable(True)\n        self.tab_widget.tabCloseRequested.connect(self.close_current_tab)\n\n        self.setCentralWidget(self.tab_widget)\n        self.status = QLineEdit()\n        self.status.setReadOnly(True)\n        self.statusBar().addPermanentWidget(self.status)\n\n        navtb = QToolBar(\"Navigation\")\n        self.addToolBar(navtb)\n\n        self.url_bar = QLineEdit()\n        self.url_bar.returnPressed.connect(self.navigate_to_url)\n\n        self.back_button = QPushButton('&lt;')\n        self.back_button.clicked.connect(lambda: self.tab_widget.currentWidget().back())\n\n        self.forward_button = QPushButton('>')\n        self.forward_button.clicked.connect(lambda: self.tab_widget.currentWidget().forward())\n\n        self.reload_button = QPushButton('R')\n        self.reload_button.clicked.connect(lambda: self.tab_widget.currentWidget().reload())\n\n        self.add_tab_button = QPushButton('+')\n        self.add_tab_button.clicked.connect(self.add_new_tab)\n\n        self.auto_browse_button = QPushButton('Auto Browse')\n        self.auto_browse_button.clicked.connect(self.toggle_auto_browse)\n\n        navtb.addWidget(self.back_button)\n        navtb.addWidget(self.forward_button)\n        navtb.addWidget(self.reload_button)\n        navtb.addWidget(self.url_bar)\n        navtb.addWidget(self.add_tab_button)\n        navtb.addWidget(self.auto_browse_button)\n\n        self.menu_bar = QMenuBar()\n        self.setMenuBar(self.menu_bar)\n\n        self.file_menu = QMenu(\"&amp;File\", self)\n        self.menu_bar.addMenu(self.file_menu)\n\n        self.bookmark_menu = QMenu(\"&amp;Bookmarks\", self)\n        self.menu_bar.addMenu(self.bookmark_menu)\n        self.bookmark_menu.addAction(\"Add Bookmark\", self.add_bookmark)\n        self.bookmark_menu.addAction(\"Show Bookmarks\", self.show_bookmarks)\n\n        self.history_menu = QMenu(\"&amp;History\", self)\n        self.menu_bar.addMenu(self.history_menu)\n        self.history_menu.addAction(\"Show History\", self.show_history)\n        \n        self.settings_menu = QMenu(\"&amp;Settings\", self)\n        self.menu_bar.addMenu(self.settings_menu)\n        self.settings_menu.addAction(\"Set Home Page\", self.set_home_page)\n        self.settings_menu.addAction(\"Set Auto Browse\", self.set_auto_browse)\n\n        self.add_new_tab(QUrl(self.home_page), \"Home\")\n\n    def add_new_tab(self, qurl=None, label=\"New Tab\"):\n        if qurl is None:\n            qurl = QUrl(self.home_page)\n\n        browser = QWebEngineView()\n        browser.setUrl(qurl)\n        i = self.tab_widget.addTab(browser, label)\n        self.tab_widget.setCurrentIndex(i)\n\n        browser.urlChanged.connect(lambda qurl, browser=browser: self.update_url(qurl, browser))\n        browser.loadFinished.connect(lambda _, i=i, browser=browser: self.tab_widget.setTabText(i, browser.page().title()))\n        browser.page().profile().downloadRequested.connect(self.download_requested)\n\n    def update_url(self, qurl, browser=None):\n        if browser != self.tab_widget.currentWidget():\n            return\n        self.url_bar.setText(qurl.toString())\n        self.status.setText(qurl.toString())\n        self.history.append(qurl.toString())\n\n    def navigate_to_url(self):\n        qurl = QUrl(self.url_bar.text())\n        self.tab_widget.currentWidget().setUrl(qurl)\n\n    def update_url_bar(self, i):\n        qurl = self.tab_widget.currentWidget().url()\n        self.url_bar.setText(qurl.toString())\n        self.status.setText(qurl.toString())\n\n    def close_current_tab(self, i):\n        if self.tab_widget.count() &lt; 2:\n            return\n        self.tab_widget.removeTab(i)\n\n    def add_bookmark(self):\n        url = self.url_bar.text()\n        if url and url not in self.bookmarks:\n            self.bookmarks.append(url)\n            QMessageBox.information(self, \"Bookmark Added\", \"Bookmark has been added.\")\n            self.save_settings()\n\n    def show_bookmarks(self):\n        dlg = QInputDialog(self)\n        dlg.setLabelText(\"Bookmarks:\")\n        dlg.setComboBoxItems(self.bookmarks)\n        dlg.exec_()\n\n    def show_history(self):\n        dlg = QInputDialog(self)\n        dlg.setLabelText(\"History:\")\n        dlg.setComboBoxItems(self.history)\n        dlg.exec_()\n\n    def set_home_page(self):\n        url, ok = QInputDialog.getText(self, \"Set Home Page\", \"Enter URL:\")\n        if ok and url:\n            self.home_page = url\n            self.save_settings()\n\n    def set_auto_browse(self):\n        url, ok1 = QInputDialog.getText(self, \"Set Auto Browse URL\", \"Enter URL:\")\n        if ok1 and url:\n            interval, ok2 = QInputDialog.getInt(self, \"Set Auto Browse Interval\", \"Enter Interval (seconds):\", min=1)\n            if ok2:\n                self.auto_browse_url = url\n                self.auto_browse_interval = interval\n                self.save_settings()\n\n    def toggle_auto_browse(self):\n        if self.timer.isActive():\n            self.timer.stop()\n            self.auto_browse_button.setText(\"Auto Browse\")\n        else:\n            self.timer.start(self.auto_browse_interval * 1000)\n            self.auto_browse_button.setText(\"Stop Auto Browse\")\n\n    def auto_browse(self):\n        if self.auto_browse_url:\n            self.tab_widget.currentWidget().setUrl(QUrl(self.auto_browse_url))\n\n    def download_requested(self, download):\n        path, _ = QFileDialog.getSaveFileName(self, \"Save File\", download.path())\n        if path:\n            download.setPath(path)\n            download.accept()\n\n    def load_settings(self):\n        if os.path.exists('browser_settings.json'):\n            with open('browser_settings.json', 'r') as f:\n                settings = json.load(f)\n                self.bookmarks = settings.get('bookmarks', &#91;])\n                self.history = settings.get('history', &#91;])\n                self.home_page = settings.get('home_page', 'http:\/\/www.google.com')\n                self.auto_browse_url = settings.get('auto_browse_url', '')\n                self.auto_browse_interval = settings.get('auto_browse_interval', 60)\n\n    def save_settings(self):\n        settings = {\n            'bookmarks': self.bookmarks,\n            'history': self.history,\n            'home_page': self.home_page,\n            'auto_browse_url': self.auto_browse_url,\n            'auto_browse_interval': self.auto_browse_interval\n        }\n        with open('browser_settings.json', 'w') as f:\n            json.dump(settings, f)\n\napp = QApplication(sys.argv)\napp.setApplicationName(\"Advanced Browser\")\nwindow = Browser()\nwindow.show()\nsys.exit(app.exec_())\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[4,65,6],"tags":[3,39],"class_list":["post-25352","post","type-post","status-publish","format-standard","hentry","category-programming","category-python","category-web","tag-programming","tag-python"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25352","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25352"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25352\/revisions"}],"predecessor-version":[{"id":25353,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25352\/revisions\/25353"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25352"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}