首页 > 解决方案 > 仅执行第一个命令并重定向到控制台窗口

问题描述

我尝试使用 tkinter 构建控制台应用程序。但是在输入第一个命令后,它只执行了。但随后什么也没有发生。

在这里,我添加了while循环,所以执行过程会继续,但仍然有同样的问题。我犯错了吗?

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

标签: python-3.xtkintercommand-prompt

解决方案


也许尝试添加一个按钮来提交条目,因为带有 tkinter 的 while 循环不在一起所以尝试做类似的事情

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

推荐阅读