2016-03-03 97 views
7

我正在使用TCL编写所有库。我想在Python中创建一个图形用户界面,它将有几个按钮和其他选项。在开始的时候TCL shell会打开。当我点击按钮时,相应的命令将在TCL外壳上执行。如何使用Python在相同的TCL shell上运行命令

是否可以在不关闭TCL shell的情况下在TCL的同一个shell上触发命令?

我搜索了谷歌并在Python中找到了Tkniter模块,但每次我需要执行命令时它都会打开TCL shell。

+0

对我来说听起来好像你在做什么每次你想运行一个命令的时候你要做一个新的解释器都是错误的。这是最大限度的开销,这是荒谬的。 –

+1

@DonalFellows我在阅读它时询问如何使用单个TCL解释器流程。例如。显然不是每次都启动一个新进程。 –

+0

不,我不想每次都做一个新的翻译。我想在相同的旧TCL shell上运行命令 – Nitesh

回答

2

你当然可以使用Tkinter的运行一系列在同Tcl解释命令:

Python 2.7.9 (default, Feb 28 2016, 05:52:45) [C] on sunos5 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Tkinter 
>>> root = Tkinter.Tk() 
>>> root.tk.eval('set msg "hello world"') 
'hello world' 
>>> root.tk.eval('string length $msg') 
'11' 
>>> root.tk.eval('foreach x {1 2 4} {puts "$msg $x"}') 
hello world 1 
hello world 2 
hello world 4 
'' 
>>> 

- 变量msg是一个命令集和它的值在以后的命令中使用此,这将不如果我们为每个命令创建一个新的解释器,则工作。 如果您不想创建Tk窗口,只需运行root.tk.eval('wm withdraw .')即可隐藏它。

如果这不回答你的问题你有更好的说明这是些什么,你需要:-)

+1

有趣的事实:可以在不创建根窗口的情况下使用tkinter。 'Tk'类有一个名为'useTk'的关键字参数。如果你将它设置为“False”,你将得到一个没有tk的tcl解释器。 –

1

这个问题可以通过使用Pexpect

Pexpect的是产卵子应用程序和自动控制 他们一个Python模块来解决。 Pexpect可以用于自动化交互式应用程序,例如ssh,ftp,passwd,telnet等。它可以用于自动化设置脚本,用于复制不同服务器上的软件包安装。它可以用于自动化软件测试 。 Pexpect秉承了Libes'Expect的精神,但Pexpect是纯Python。 Python 的其他类似于Expect的模块需要TCL和Expect,或者需要编译C扩展。 Pexpect不会 使用C,Expect或TCL扩展。它应该可以在任何支持标准Python pty模块的平台上工作。 Pexpect界面集中于易用性,因此简单的任务很容易。

使用例直接从网站Pexpect的

child = pexpect.spawn('scp foo [email protected]:.') 
child.expect ('Password:') 
child.sendline (mypassword) 

采取可以产卵终端作为子进程,然后使用这个孩子时GUI生成一个事件发送命令。

+1

提问者说他​​有已经用Tcl编写的库,他需要从Python调用。期望式功能在这里是无关紧要的。 –

+0

是的,但我认为可以通过将单击Python GUI上的按钮时生成的事件与期望语句相关联来实现。 – Sharad

+0

如果在这里丢失了某些东西,请详细说明 – Sharad

0

我创造了这个简单的TCL程序pgm.tcl

puts "Hello world" 

我可以在启动它控制台

tclsh pgm.tcl 

下面是它如何在Python推出

from subprocess import Popen, PIPE 
p1 = Popen(['tclsh', 'pgm.tcl'], stdout=PIPE) 
p1out, p1err = p1.communicate() 
if p1out is not None: print (p1out) 
if p1err is not None: print (p1err) 

这个答案依赖于操作系统(linux),但你应该能够适应其他操作系统。