Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在python3中调用tcl进程_Python 3.x_Tcl - Fatal编程技术网

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')
是错误的。Tcl
proc
命令定义命令;要调用它们,只需使用命令名:
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()