【问题标题】:Logging output of TCL script into Tkinter text widget将 TCL 脚本的输出记录到 Tkinter 文本小部件中
【发布时间】:2017-09-06 12:41:14
【问题描述】:

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

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

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

完整代码:

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

完整代码:https://gist.github.com/bitsgalore/901d0abe4b874b483df3ddc4168754aa

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

有什么办法可以做到这一点吗? 问候

【问题讨论】:

  • 显示一些代码,然后我们可以告诉一些事情
  • @AkshayKathpal 我已经添加了代码,但正如我所说,它们是 2 个不同的任务,我不知道如何加入它们

标签: python python-2.7 logging tkinter tcl


【解决方案1】:

这是一种有点静态的方法。 您可以使用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.insert(tk.END, run_process()) 轻松地将其登录到Text 小部件。

这里有一个简短的例子来证明这一点:

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()

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

【讨论】:

  • 我已经运行了一个 python 脚本并将它的标准输出捕获到文本小部件,但以其他方式。我也会尝试这种方法并回复您。我仍然不确定这是否适用于我的 TCL 脚本。
  • 我最终采用了一种非常不同的方式,但您的解决方案也很好。唯一缺少的是它不能并行显示。一旦整个脚本完成,它就会显示完整的输出
  • @MohsinShafiq 是的,我尝试并摆弄了一段时间的文件描述符,以便将stdout 实时重定向到小部件,但我找不到任何解决方案......你是怎么结束的起来做吗?您介意将其发布为答案吗?
  • 我正在运行的脚本已经将所有输出的日志记录到 .log 文件中。我使用了此处提供的解决方案:gist.github.com/bitsgalore/901d0abe4b874b483df3ddc4168754aa 此代码创建了一个单独的线程来在运行时更新文本小部件的内容。我添加了另一个调用我的脚本的线程。脚本正在创建一个文本文件。所以另一个线程负责读取 .log 文件并将其逐行放入文本小部件中。首先运行代码并进行更改以根据您的需要进行更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多