Только первая команда выполнена и перенаправлена ​​в окно консоли - PullRequest
0 голосов
/ 23 октября 2019

Я пытался собрать консольное приложение, используя tkinter. Но после ввода первой команды она только выполняется. Но тогда ничего не происходит.

Здесь я добавил цикл , в то время как , чтобы процесс выполнения продолжался, но все еще имел ту же проблему. Я сделал ошибку?

import sys
import tkinter as tk
from tkinter import *
from tkinter import font
from tkinter.font import *
import subprocess
import threading
from threading import Thread``

consl = Tk()
consl.geometry("1200x380")
consl.resizable(1, 1)
consl.configure(background='black')

cmd_OP = Canvas(consl, width=1000, height=500, background="black")
cmd_OP_viewer = Text(cmd_OP, width=700, height=350, background="black", foreground="green")

cmd_OP.create_window((0,0), window=cmd_OP_viewer, anchor=NW)
ScBar = tk.Scrollbar(orient="vertical", command=cmd_OP_viewer.yview, background="grey")
cmd_OP_viewer.configure(yscrollcommand=ScBar.set)
cmd_OP_viewer.pack(side=TOP, expand=True, fill=X)``

#Font for all output & other operations.
helv9 = font.Font(family='Helvetica', size=9, weight=tkinter.font.BOLD)

#input of the console are being set.
l1 = Label(consl, text=os.getcwd(), background="black", foreground="white")

entry = Entry(consl, background="black", foreground="white")
entry.pack(side=BOTTOM, anchor=SW, expand=TRUE, fill=X)
entry.insert(0, '')
entry.delete(0, END)
entry.pack()

l1.pack(side=BOTTOM, anchor=SW, expand=TRUE)
cmdOP = subprocess.check_call(entry.get(), shell=True)
entry.bind("<Return>", (lambda event: (get_entry())))

cmd_OP.pack( )


def run_win_cmd():
    result = []
    try:
        process = subprocess.Popen(entry.get(),
                                   shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE, universal_newlines=False)
    except:
        process = os.system(entry.get())
    for line in process.communicate():
        result.append(line)
    errcode = process.returncode
    for line in result:
        data = "".join(map(bytes.decode, result))
        return data
    if errcode is not None:
        raise Exception('cmd %s failed, see above for details for :: \n', entry.get(), process)

def get_entry():
    while TRUE:
        if entry.get() != "exit":
            cmd_OP_viewer.insert(END, str(run_win_cmd()))
            cmd_OP_viewer.config(state=DISABLED)
            entry.delete(0, END)
            break
    else:
        os.system(exit())


if __name__ == '__main__':
    consl.mainloop()```

1 Ответ

0 голосов
/ 23 октября 2019

Возможно, попробуйте добавить кнопку для отправки записи, поскольку циклы while с tkinter не сочетаются друг с другом, поэтому попробуйте сделать что-то вроде

btn = Button(consl, text="Submit", command=get_entry)
btn.pack()
def get_entry():
    if entry.get() != "exit":
        cmd_OP_viewer.insert(END, str(run_win_cmd()))
        cmd_OP_viewer.config(state=DISABLED)
        entry.delete(0, END)
        break
    else:
        os.system(exit())
...