天天看點

用Tkinter打造GUI開發工具(42)Tkinter與TCL/Tk混合程式設計

用Tkinter打造GUI開發工具(42)Tkinter與TCL/Tk混合程式設計

Tcl/Tk的GUI工具組,它是John Ousterhout在Scriptics公司支援下建立的Tcl/Tk圖形接口。是由C語言編寫的圖形擴充庫和子產品,實作了類似Windows視窗的X視窗系統功能。由Steen Lumholt和Guido van Rossum撰寫了Python的Tkinter子產品,Tkinter子產品利用了Tcl/Tk的C擴充庫(_tkinter)。用Tkinter開發程式不需要關注Tcl/Tk的接口和實作,是以Tkinter作為獨立的Python擴充子產品看待,目前Tkinter成為Python的标準GUI庫。也就是說官網下載下傳的Python安裝包已經包含有Tkinter庫了。很多Python工具都建立在Tkinter庫的基礎上,例如:

Python IDLE,Turtle繪圖庫…等都是用Tkinter編寫而成。

Python是解釋腳本語言,TCL也是解釋腳本語言,由于Tkinter庫的存在,是以Python可間接支援TCL語言,可以運作TCL程式和TCL子產品檔案。

下面先看直接運作TCL程式的方法。

import tkinter as tk

#檢視tkinter版本号
print('Tkinter版本:', tk.TkVersion)

#建立一個tcl的解釋器
tcl = tk.Tcl()

#察看tcl版本号
print( 'Tcl版本:',tk.TclVersion)

#tcl語言腳本
tclcode='''
proc add {n m} {
    return [expr $n+$m]
}
'''
#執行tcl語言腳本
tcl.eval(tclcode)
#調用函數,tcl_str為傳回值
tcl_str=tcl.eval('add 30 40')
#顯示結果
print( tcl_str)
           

程式執行結果如下:

Tkinter版本: 8.6
Tcl版本: 8.6
70
           

如果要執行TCL子產品檔案,可以如下操作。

1、建立tcl程式檔案

proc sayHello {} {
    return "Hello TCL world!"
}

proc add {num1 num2} {
	return [expr $num1 + $num2]
}
           

2、運作的Python代碼如下:

import tkinter as tk

#建立一個tcl的解釋器
tcl = tk.Tcl()

#導入tcl檔案
tcl.eval('source tcltest.tcl')

#調用函數,tcl_str為傳回值
tcl_str=tcl.eval('add 35  15')
print( tcl_str)

tcl_str=tcl.eval('sayHello')
print(tcl_str)

root=tk.Tk()
lb=tk.Label(root,text=tcl_str)
lb.pack()
           

運作結果如下:

50
Hello TCL world!
           

通過上面測試,我們可以說,Python中已經包含了2種語言。想學習Tcl語言的朋友可以用Python開發一個TCL學習工具了。

上面大家看到的不是重點,下面才是重點。

既然Tkinter建立在TCL/tk的基礎上實作的,是以我們可以在程式中直接調用底層的TCL/tk腳本來開發Tkinter程式,也可以通過自編tcl控件子產品來增強Tkinter的功能。

python的tcl的子產品在python.exe執行檔案所在目錄下的“tcl”子目錄中。

python的tcl的接口庫“_tkinter.lib”在python.exe執行檔案所在目錄下的“libs”子目錄中。

Tkinter調用TCL/tk庫是通過“_tkinter.lib”庫中的“tk.call”或“_tk.call”來實作的。

下面直接給出示範代碼。

import tkinter as tk
#建立一個tcl的解釋器
tcl = tk.Tcl()

#察看tcl版本号
print( 'Tcl版本:',tk.TclVersion)
#導入tcl檔案
tcl.eval('source tcltest.tcl')
#調用函數,tcl_str為傳回值
tcl_str=tcl.eval('add 35  15')
print( tcl_str)

tcl_str=tcl.eval('sayHello')
print(tcl_str)

#建立Tkinter主視窗
root=tk.Tk()
lb=tk.Label(root,text=tcl_str)
lb.pack()

lb2=tk.Label(root,text="标簽2")
root.tk.call('pack','configure', lb2._w)  #lb2.pack()
root.tk.call('update')  #root.update()


height=root.tk.call('winfo', 'height', root._w) #擷取主視窗高度
print('root視窗高度:',height)

root.mainloop()
           

程式執行結果:

Tcl版本: 8.6
50
Hello TCL world!
root視窗高度: 46
           

顯示圖形如下:

用Tkinter打造GUI開發工具(42)Tkinter與TCL/Tk混合程式設計

通過這篇文章介紹,是不是感覺Tkinter深度開發的潛力很大。

可以通過下面方式與我交流:

#獨狼荷蒲qq:2775205

#通通小白python量化群:524949939

#電話微信:18578755056

#通通小白python量化群:524949939

#tkinter,pyqt,gui,Python學習群:647866213