用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深度开发的潜力很大。
可以通过下面方式与我交流:
#独狼荷蒲qq:2775205
#通通小白python量化群:524949939
#电话微信:18578755056
#通通小白python量化群:524949939
#tkinter,pyqt,gui,Python学习群:647866213