如何将脚本的输出重定向到tkinter窗口?

时间:2019-06-13 04:42:28

标签: python tkinter

我试图单击tkinter按钮打开一个新的tkinter窗口,以在其中执行脚本,直到必要时一直使用滚动条。但是,到目前为止,我仅能使它在Linux窗口中而不是在tkinter窗口中以多种方式运行才成功。有人可以帮助我将此脚本的输出重定向到顶级窗口吗?

self.button_run = Button(self, text="RUN", width=16, command=self.callpy)
self.button_run.grid(row=25, column=0, columnspan=2, sticky=(W + E + N + S))

def run_robbot(self):
    new = Toplevel(self)
    new.geometry('500x200')
    label = Message(new, textvariable=self.callpy, relief=RAISED)
    label.pack()

def callpy(self):
    pyprog = 'check_asim.robot'
    call(['robot', pyprog])

在上面的代码片段中,如果我在Button中将callpy传递给命令,它将在Linux窗口中运行机器人脚本。如果我将其替换为调用run_robbot,这是我想要和期望的,它将仅弹出一个带有消息框的新窗口,而无需运行传递给textvariable的相同脚本。我也尝试过Enter来代替Message Box。

我希望单击按钮在Toplevel tkinter窗口中执行callpy。我该怎么做?任何tkinter运算符都可以,只要它局限于tkinter窗口即可。

1 个答案:

答案 0 :(得分:0)

如果要捕获命令的输出,则应改用subprocess.run(cmd,capture_output=True)。下面是示例代码:

import subprocess
from tkinter import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        Button(self, text='Run', command=self.run_robot).pack()

    def run_robot(self):
        win = Toplevel(self)
        win.wm_attributes('-topmost', True)
        output = Text(win, width=80, height=20)
        output.pack()
        output.insert(END, 'Running ....')
        output.update()
        result = self.callpy()
        output.delete(1.0, END)
        output.insert(END, result)

    def callpy(self):
        pyprog = 'check_asim.robot'
        return subprocess.run(['robot', pyprog], capture_output=True).stdout

App().mainloop()