Python 3.x 在python3中调用tcl进程
我试图在Python 3.x 在python3中调用tcl进程,python-3.x,tcl,Python 3.x,Tcl,我试图在python程序中调用tclproc tcl脚本以 proc scale_wigner-seitz_radii { } { (我不确定是否可以将完整程序放在这里,因为这是许可程序的一部分) 此程序由我的python脚本调用: #!/usr/bin/python3 import sys from numpy import arange from tempfile import mkstemp from shutil import move, copy from os import rem
python
程序中调用tcl
proc
tcl
脚本以
proc scale_wigner-seitz_radii { } {
(我不确定是否可以将完整程序放在这里,因为这是许可程序的一部分)
此程序由我的python脚本调用:
#!/usr/bin/python3
import sys
from numpy import arange
from tempfile import mkstemp
from shutil import move, copy
from os import remove, close, mkdir, path
import Tkinter
def repll(file_path, pattern, subst):
print(pattern)
print(subst)
print(file_path)
r = Tkinter.Tk
# fullpath = str(subst) + "/" + file_path
fh, abs_path = mkstemp()
with open(abs_path, "w") as new_file:
with open(file_path, "r") as old_file:
for line in old_file:
new_file.write(line.replace(pattern.strip(),
str(subst).strip()))
r.tk.eval('source /home/rudra/WORK/xband/create_system_util.tcl')
r.tk.eval('proc scale_wigner-seitz_radii')
copy(abs_path, path.join(str(subst), file_path))
inpf = str(sys.argv[1])
a = []
print (inpf)
with open(inpf, "r") as ifile:
for line in ifile:
if line.startswith("lattice parameter A"):
a = next(ifile, "")
print(a)
for i in arange(float(a)-.10, float(a)+.10, 0.02):
if not path.exists(str(i)):
mkdir(str(i))
repll(inpf, a, i)
我没有举一个最小的例子,因为这似乎比用英语解释要好
在def repll
的末尾,它正在调用tcl proc
。我以前从未遇到过tcl脚本,并从中找到了调用过程。
但是当我运行这个程序时,我得到了一个错误:
Traceback (most recent call last):
File "xband.py", line 41, in <module>
repll(inpf, a, i)
File "xband.py", line 24, in repll
r.tk.eval('source /home/rudra/WORK/xband/create_system_util.tcl')
AttributeError: class Tk has no attribute 'tk'
很抱歉,如果这很愚蠢,但是由于tcl在不同的文件中,我必须首先找到它的来源,对吗?正如我所说,这是我看到的第一个tcl代码,请详细说明。问题似乎在于这一行:
r = Tkinter.Tk
我的猜测是,您认为这是在创建Tk
的实例,但您只是在保存对该类的引用,而不是创建该类的实例。当您实例化它时,返回的对象有一个名为tk
的属性,对象内部使用该属性引用tcl解释器。因为您没有实例化它,r
(指向Tk
)没有这样的属性
要修复它,请通过添加括号实例化该类:
r = Tkinter.Tk()
r
现在将是对Tk
对象的正确引用,并且应该有一个Tk
属性,使用该属性,您可以对原始tcl代码调用eval
。您还没有遇到这个错误,但是r.Tk.eval('proc scale\u wigner-seitz\u radii')
是错误的。Tclproc
命令定义命令;要调用它们,只需使用命令名:r.tk.eval('scale\u wigner-seitz\u radii')
。您还需要对其他bug进行分类(修复方法可能也适用于此)。从Tcl的角度来看,您必须首先源代码文件,然后调用其中的过程。这可以在单个脚本调用中完成:source/home/rudra/WORK/xband/create\u system\u util.tcl;scale_wigner-seitz_radii
(使用;
分隔两个命令调用)。您还需要对Python方面的内容进行分类,因为您似乎在错误的实体上调用了tk
方法。你需要实例化Tk
类吗?嗨,多纳尔,如果你有空,我能告诉你吗?正如我所说的,由于tcl是许可代码的一部分,所以我不太怀疑它的公开性,因为我对Python的了解还不足以帮助您。我已经提供了您真正需要的所有Tcl帮助(好吧,不管怎么说,这个问题)。而且我在一周中有相当忙碌的日子…
r = Tkinter.Tk()