python-3.x - 仅执行第一个命令并重定向到控制台窗口
问题描述
我尝试使用 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()```
解决方案
也许尝试添加一个按钮来提交条目,因为带有 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())
推荐阅读
- javascript - 使用状态 | 不设置新状态的 useEffect 会导致额外的重新渲染
- swift - 尽管使用了用户默认值,为什么我的单例类在重建时无法保留信息?
- websocket - 检查是否可以访问 Websocket 地址和端口的命令
- python - 这是 seaborn.lineplot 色调参数中的错误吗?
- java - @Cacheble 和 @Scheduled 在 Spring Boot 应用程序中同时启动
- javascript - 如何在没有严格模式的情况下执行 deno?错误:未捕获的 SyntaxError:标识符“列表”已被声明
- amazon-web-services - 并行运行 lambda 或更好的方法
- powershell - Powershell复制具有特定数字的多个文件
- javascript - 如何在javascript中对具有嵌套数组的对象进行排序
- xamarin.forms - 将 Xamarin Forms 与 Prism 一起使用时,“public App() : this(null) { }”有什么作用