【问题标题】:Add web browser window to Tkinter window将 Web 浏览器窗口添加到 Tkinter 窗口
【发布时间】:2019-02-25 10:04:59
【问题描述】:

我用 python tkinter 制作了一个 gui 应用程序,我想在我的 TKINTER WINDOW 中放置一个小型的小型网络浏览器,而不是打开一个新标签,我该怎么做?

【问题讨论】:

    标签: python-3.x tkinter python-webbrowser


    【解决方案1】:

    你不能。 tkinter 库中没有允许您显示 HTML 的小部件。如果您真的需要使用 tkinter,您可以尝试 tkinterhtml,但这很奇怪,并且不适用于很多功能(超链接、图像...)

    如果你只是想创建一个带有 web 界面的 python 应用程序,你最好使用一个 python web 框架,如flaskdjango

    【讨论】:

      【解决方案2】:

      这是一个老问题,但对于将来遇到这个问题的人来说,在 tkinter 中嵌入网页是可能的。

      你可以试试tkinterweb(免责声明:我是作者)。它基于tkinterhtml,但支持超链接、样式、图像等。 只需使用pip install tkinterweb 安装它,然后运行:

      import tkinterweb
      import tkinter as tk
      root = tk.Tk()
      frame = tkinterweb.HtmlFrame(root)
      frame.load_website(YOUR_WEBSITE)
      frame.pack(fill="both", expand=True)
      root.mainloop()
      

      Tkinterweb 使用已停产的 Tk HTML 小部件,因此复杂的网站可能无法正常运行。不过,更简单的网站也能正常工作。

      另一个不错的选择是cefpython,它是嵌入在 Tkinter 中的成熟的 chromium 浏览器。在 tkinter 中使用 cefpython 的示例可以在 https://github.com/cztomczak/cefpython/blob/master/examples/tkinter_.py 找到。不幸的是,cefpython 在较新的 python 版本中确实存在一些问题,并且可能有点消耗资源,但它确实工作得很好。

      如果您需要在您的 Tkinter 应用程序中使用完整的网络浏览器,我建议您尝试使用 cefpython。如果您只需要非常快速简单的东西来显示基本网页或帮助窗口,请尝试 tkinterweb。

      【讨论】:

      • 我试过 tkinterweb,但它甚至在 tkinter 窗口弹出之前就停止了代码。这是我的代码:import tkinterweb import tkinter as tk root = tk.Tk() frame = tkinterweb.HtmlFrame(root) frame.load_website("https://www.google.com") frame.place(0, 0) root.mainloop() 输出为:UserNotification: Fetching Tkhtml3 for 64-bit Windows with Python 3.7.9. Tkhtml3 found in C:\Users\ymzym.DESKTOP-TQFQIM2\AppData\Local\Programs\Python\Python37\lib\site-packages\tkinterweb\tkhtml\Windows\64-bit. UserNotification: Connecting to www.google.com.
      • 您好,感谢您让我知道这件事。看起来您使用的是 64 位 Windows。有一个已知的 Microsoft C 编译器错误会导致 TkinterWeb 在某些 64 位 Windows 平台上崩溃。目前正在解决这个问题,希望很快能得到解决。您可以在github.com/Andereoo/TkinterWeb/issues/2找到详细信息。
      • @YılmazAlpaslan 64 位 Windows TkinterWeb 的问题已解决。考虑重新安装 TkinterWeb。
      • 我很高兴听到这个消息。我将重新安装 TkinterWeb。祝你有美好的一天!
      • @Andoo,如何使用 tkinterweb 打开本地文件?我正在尝试使用运行我的 html 代码的 tkinterweb 打开浏览器
      【解决方案3】:

      我知道这是一个老问题,但如果您想创建网络浏览器窗口,我建议您使用PyQt5

      这是一个基本实现,它将打开一个自定义浏览器到谷歌主页:

      import sys
      from PyQt5.QtCore import *
      from PyQt5.QtWidgets import *
      from PyQt5.QtWebEngineWidgets import *
      
      class MainWindow(QMainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.browser = QWebEngineView()
              self.browser.setUrl(QUrl('http://google.com'))
              self.setCentralWidget(self.browser)
              self.showMaximized()
      app = QApplication(sys.argv)
      QApplication.setApplicationName('Example Custom Browser')
      window = MainWindow()
      app.exec_()
      

      除了执行 google 搜索之外,这个浏览器没什么用处,但是您可以添加一个带有功能按钮的导航栏,而无需额外的努力。一种基本方式可能如下所示:

              navbar = QToolBar()
              self.addToolBar(navbar)
      
              back_btn = QAction('Back', self)
              back_btn.triggered.connect(self.browser.back)
              navbar.addAction(back_btn)
      
              forward_btn = QAction('Forward', self)
              forward_btn.triggered.connect(self.browser.forward)
              navbar.addAction(forward_btn)
      
              reload_btn = QAction('Reload', self)
              reload_btn.triggered.connect(self.browser.reload)
              navbar.addAction(reload_btn)
      
              home_btn = QAction('Home', self)
              home_btn.triggered.connect(self.navigate_home)
              navbar.addAction(home_btn)
      
              self.url_bar = QLineEdit()
              self.url_bar.returnPressed.connect(self.navigate_to_url)
              navbar.addWidget(self.url_bar)
      
              self.browser.urlChanged.connect(self.update_url)
      
          def navigate_home(self):
              self.browser.setUrl(QUrl('https://www.google.com'))
      
          def navigate_to_url(self):
              url = self.url_bar.text()
              self.browser.setUrl(QUrl(url))
      
          def update_url(self, q):
              self.url_bar.setText(q.toString())
      

      如果您将其添加到MainWindow 类,您现在应该会在左上角看到“返回”、“前进”、“重新加载”和“主页”按钮。他们会按照您的预期行事,即让您前进、后退一页、重新加载页面或带您回家(我只是将其设置为 google.com)。

      抱歉,这篇文章太长了,但我希望它演示了如何简单地实现一个 PyQt5 浏览器窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        相关资源
        最近更新 更多