用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

上一篇:c – QProcess多平台命令


下一篇:c – 使用GCC 4.5崩溃编译的程序,而GCC 4.4则没问题