将TCL脚本的输出记录到Tkinter文本小部件

时间:2017-09-06 12:41:14

标签: python python-2.7 logging tkinter tcl

我做了两件事,现在我想加入这两件事。 我在Windows 8上使用命令提示符

  1. 我有一个可以从python运行的TCL文件。它在命令提示符下提供所有输出。我使用此命令来运行TCL

    os.system(r'vivado -mode tcl -source location / my_tcl.tcl')

  2. 完整代码:

    import Tkinter as tk
    import os
    import time
    
    my_gui = tk.Tk()
    mvar = tk.StringVar()
    
    def my_hello():
        chk = mvar.get()
        if chk == '1':
            os.system(r'vivado -mode tcl -source path/my_tcl.tcl')
            f = open('input.txt', 'r')
            a = f.readline().rstrip('\n')
            if a == 'Passed':
                mlabel = tk.Label(my_gui,text = 'Test Passed', fg = 'black', bg = 'green',width = 10).place(x=200,y=10)
            else:
                mlabel = tk.Label(my_gui,text = 'Test Failed', fg = 'black', bg = 'red',width = 10).place(x=200,y=10)
            f.close
        else:
            mlabel = tk.Label(my_gui,text = 'No Test Run', fg = 'black', bg = 'yellow',width = 10).place(x=200,y=10)
    
    my_gui.geometry('300x300+200+200')
    my_gui.title('Test')
    
    mbutton = tk.Button(my_gui,text = 'Run Tests!',command = my_hello).place(x=150,y=280,anchor= 'center')
    
    check1 = tk.Checkbutton(my_gui,text = 'DDR Test',state = 'active', variable = mvar).place(x=10,y=10)
    mvar.set('0')
    
    
    my_gui.mainloop()
    
    1. 我已经在python上实现了以下解决方案的简单日志记录:Python Logging to Tkinter Text Widget
    2. 完整代码:https://gist.github.com/bitsgalore/901d0abe4b874b483df3ddc4168754aa

      现在我想结合这两个部分,但是日志记录需要某种字符串输入才能存储和显示日志。而TCL的输出出现在命令提示符下。我想要实现的是命令提示符上显示的所有内容都可以在我的Tkinter文本小部件上看到。

      有没有办法可以做到这一点? 此致

1 个答案:

答案 0 :(得分:2)

这是一种有点静态的方法。 您可以使用subprocess模块,该模块允许您捕获进程的输出,然后将其显示在tkinter.Text小部件中。

import subprocess

def run_process():
    path = "script_with_some_output"
    p = subprocess.run(path, stdout=subprocess.PIPE)

    return p.stdout

现在,您可以调用run_process()来执行您的进程,并将其输出作为一个字节序列。 您可以通过调用Text轻松将其记录到text.insert(tk.END, run_process())窗口小部件中。

以下是一个简短的例子:

import tkinter as tk
import sys
import subprocess

def run_process():
    path = r"path/to/script"
    p = subprocess.run("python"+path, stdout=subprocess.PIPE)
    return p.stdout

root = tk.Tk()
log = tk.Text(root)
b = tk.Button(root, text="Run stuff", command=lambda: log.insert(tk.END, run_process()))

log.pack()
b.pack()    

root.mainloop()

此脚本将运行位于给定路径的脚本,并在文本小部件中显示其输出。