tkinter浏览器组件
tkinter瀏覽器組件
- 引言
- 構思
- tcl方面
- dll方面
- 嵌入窗口!
- 創建瀏覽器窗口
- 語言選擇
- 創建窗口
- 嵌入窗口
- 新的tkinter瀏覽器組件:2021-8-10更新
- tkinterie的簡單使用:2021-8-16更新
- tkinterIE的功能:2021-8-16更新
- 新的tkinter網頁組件:2021-12-25更新
- tkinterie使用新API:2022-4-9更新
- tkinterie小改進:2022-6-18
- 結語
引言
當然,tkinter原生的核心組件并沒有瀏覽器組件,這是使得tkinter與wxpython和PYQT的差距非常大的原因之一。為了使tkinter窗口能夠顯示網頁,很多人都為tkinter提供了配套綁定的瀏覽器組件==(注意是瀏覽器組件,不是html富文本框)==。以下是比較常用的方法或者綁定:
- tkinterhtml(TkHtml的Python綁定,過時很久了,HTML4的風格,但tkinterweb做得挺好)
- TkHtml(tkinter的瀏覽器組件dll拓展,也是比較過時的)
- HV3(tkinter的瀏覽器組件dll拓展,與TkHtml配合使用,現代外觀,但依舊比較老)
- cefpython(Python的谷歌綁定,保持更新,但體積大)
那么我們怎么樣才能夠做到擁有現在外觀,體積小巧的瀏覽器組件呢?
構思
tcl方面
我們知道,tkinter是對tcl/tk的綁定,如果我們在tcl組件中加入瀏覽器拓展組件,問題就解決了。但是,這種方法編寫復雜,不易成功,而且就目前使用在tcl的瀏覽器拓展,效果都與現代外觀瀏覽器差距甚遠。
dll方面
使用系統ie組件或 edgehtml.dll 等dll拓展或許是一個不錯的方法。但是結構是這樣的:先用Python注冊和使用dll的函數,再將效果傳入tcl……這明顯,超出實力范圍了……
嵌入窗口!
這是集簡單、高效、美觀為一體的方法——嵌入外部瀏覽器窗口。很多GUI語言都自帶瀏覽器組件使用方法,將這些代碼編譯成exe文件后,再將文件顯示在需要顯示的frame中,就成了tkinter的瀏覽器組件。
創建瀏覽器窗口
注意!!!,這一段內容必不可少,因為tkinter顯示網頁確實需要外部程序的支持!!!
語言選擇
為了方便,選擇 aardio語言,這個語言帶有拓展GUI界面和快捷的智能提示(國人開發的)。
創建窗口
這里直接給出 aardio 代碼:
import win.ui.minmax; import win.ui; import win.image; import web.form; /*DSG{{*/ mainForm = win.form(text="HtmlShow";left=0;top=0;right=895;bottom=700;border="thin";minimize=1;mode="popup";title=false) mainForm.add() /*}}*/Path=io._exedirwin.ui.minmax(mainForm)var wb=web.form(mainForm) wb.noScriptErr=true;arg=_CMDLINE if (arg!=null){wb.go(arg) }else {wb.go("\res\NoneHtml.html")//這行可以省略,沒必要,測試時使用 }wb.NewWindow3 = function(ppDisp,cancel,dwFlags,bstrUrlContext,bstrUrl ) { wb.go(bstrUrl)return ppDisp,true; };mainForm.show(); return win.loopMessage();思路就是創建細邊框、無標題欄的彈出式窗口,然后最小化,使用時避免視覺干擾。最后,發布成exe文件。
嵌入窗口
在這我之前的一篇文章中,講述了如何用 win32gui 在tkinter窗口中嵌入外部窗口。如果忘記或不知道,請到我的“tkinter實驗”專欄中查找“tkinter創建真正的子窗口”。這里再次說明,我的那篇文章的方法,不僅可以嵌入tkinter窗口,還可以嵌入任何一個exe窗口(UPW應用不太穩定)。
首先,明白exe窗口標題(雖然沒有標題欄)為“HtmlShow”,其次,將exe文件放入一個目錄中,并且使用絕對路徑。
現在我們來編寫代碼:
from subprocess import Popen from tkinter import *#為了方便,一般不建議使用 import win32gui from time import sleep as slpresultframe=Frame(master)#創建frame ###using exe #Popen必須是完整路徑(絕對路徑),url為網址 Popen([TinPath+'\\data\\bin\\HtmlShow.exe',url]) slp(1)#等待窗口創建 hid=win32gui.FindWindow(None,u"HtmlShow")#獲取窗口句柄 win32gui.SetParent(hid,resultframe.winfo_id())#顯示窗口思路和原因,在注釋已經說明了,這里就不再解釋。
TinPath為該程序的運行目錄,我將生成的HtmlShow.exe放在這個目錄的\data\bin\下
注意到外部窗口的大小已經設定好,如果想要覆蓋整個frame,還可以調整外部窗口大小或者使用win32gui.ShowWindow(hid,win32con.SW_MAXIMIZE)
效果如下:
Tin知識庫
新的tkinter瀏覽器組件:2021-8-10更新
通過對tkinter瀏覽器組件各種實現的研究中,我編寫了新的tkinter拓展——tkinterie,該模塊通過com調用系統IEFrame,啟動webview組件,為tkinter窗口提供一個webview組件。
目前該模塊已被我上傳至pypi,通過pip install tkinterie安裝。
2021-8-16更新:使用tkinterie必須保證IE的com接口可以正常訪問,也要保證有ieframe.dll,若不能使用就放棄tkinterie。
tkinterie的簡單使用:2021-8-16更新
通過pip安裝tkinterie模塊后,使用如下代碼,可以顯示HTML5元素。
注意是渲染HTML5元素,并不是一個完整的瀏覽器。
from tkinter import * from tkinterie.tkinterIE import WebViewa=Tk() a.geometry('700x500+100+100')w=WebView(a,500,500,'www.baidu.com') w.pack(expand=True,fill='both')a.mainloop()效果如下:
tkinterIE的功能:2021-8-16更新
- 渲染HTML5元素以及css設計(網頁或文件)
- 運行JavaScript(網頁或文件)
- 提供的WebView組件可以像正常tkinter組件一樣非自動或自動調整尺寸
- 多線程使用(使用過程中可能會報錯,但不影響使用)
- 嵌入到tkinter的Canvas和Text(若被半遮蔽可能報錯,但不影響使用)
- 點擊新窗口鏈接在本地打開
- 在程序內渲染HTML5元素等網頁內容
- 自主限制edge自動打開
新的tkinter網頁組件:2021-12-25更新
為了解決IE即將壽終正寢,而且在Python中的支持不佳的問題,我基于pythonnet和pywebview寫了新的tkinter網頁組件——tkwebview2。這將允許tkinter使用Windows提供的WebView2。
具體文章
tkinterie使用新API:2022-4-9更新
考慮到之后無法直接使用InternetExplorer.Application,現在最新版的tkinterie(-1.4.0-)不再使用comtypes,而是使用pythonnet,通過 .Net 使用WinForms框架創建WebBrowser組件。
新版的tkinter有以下好處:
當然,有以下兩個前提:
tkinterie小改進:2022-6-18
添加了一些基礎方法:刷新、前一頁、下一頁、搜索界面等。
結語
看完這篇文章,相信你對tkinter的使用更上一層樓,tkinter還可以實現更多功能,這等待我們來探索。怎么樣,不如現在試試?
使用pip下載:
pip install tkinterie?tkinter創新?
總結
以上是生活随笔為你收集整理的tkinter浏览器组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPS格式文件转图片格式如何进行操作
- 下一篇: ajax打开新窗口被浏览器拦截的解决办法