Как перенаправить вывод скрипта в окно tkinter? - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь нажать кнопку 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])

В приведенном выше фрагменте, если я передаю callpy команде в Button, он запускает скрипт робота в окне linux. Если я заменю его на вызов run_robbot, чего я и ожидаю, он просто откроет новое окно с окном сообщений, не запуская тот же скрипт, переданный textvariable. Я пробовал войти вместо окна сообщения.

Я хочу, чтобы callpy выполнялся в окне Toplevel tkinter по нажатию кнопки. Как мне это сделать? Подходит любой оператор tkinter, если он ограничен окном tkinter.

1 Ответ

0 голосов
/ 13 июня 2019

Если вы хотите захватить выходные данные команды, вы должны использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...