控制台输出为 Tkinter 标签
Posted
技术标签:
【中文标题】控制台输出为 Tkinter 标签【英文标题】:Console output as Tkinter label 【发布时间】:2022-01-22 05:22:04 【问题描述】:我正在使用 Python 3.8 和 Tkinter 为 youtube-dl 制作一个 GUI,我想通过使用控制台中的最新行来添加一个进度条。
例如,这将是最新的一行:
[download] 27.4% of 519.64KiB at 46.52KiB/s ETA 00:08
在 GUI 中它看起来像这样:
我当前的代码如下所示
class MainMenu():
# some code before it
terminaloutput = subprocess.check_output
progressbar = Label(window, text=terminaloutput)
# rest of the code
还有这个
def convert():
MainMenu.progressbar.pack()
# rest of the code
但它在 GUI 中显示的只是:
请记住,终端会显示它应该显示的内容。
[youtube] neq82Pi3jG4: Downloading webpage
[download] Destination: /home/markix/Desktop/Retray WR i beat you khasem (642) click Scroll Click.m4a
[download] 100% of 519.64KiB in 00:11
[ffmpeg] Correcting container in "/home/markix/Desktop/Retray WR i beat you khasem (642) click Scroll Click.m4a"
那么...我该如何解决这个问题?谁能帮帮我?
【问题讨论】:
能否提供完整的minimal reproducible example?看来您需要定期检查控制台输出 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:我会使用在后台工作的单独线程,该线程负责读取进程的输出流和修改标签的文本。 像这样的
import tkinter as tk
import subprocess
import threading
class CmdThread (threading.Thread):
def __init__(self, command, textvar):
threading.Thread.__init__(self)
self.command = command
self.textvar = textvar
def run(self):
proc = subprocess.Popen(self.command, stdout=subprocess.PIPE)
while not proc.poll():
data = proc.stdout.readline()
if data:
print(data)
self.textvar.set(data)
else:
break
window = tk.Tk()
text = tk.StringVar()
label = tk.Label(textvariable=text)
label.pack()
thread = CmdThread(['netstat'], text)
thread.start()
window.mainloop()
【讨论】:
(在 GUI 中)它显示“unix 3 [] STREAM CONNECTED 52751” 所以没关系,因为它可能是我在这里使用的示例 netstat 命令的最后一行。用其他命令替换它以获得您需要的输出以上是关于控制台输出为 Tkinter 标签的主要内容,如果未能解决你的问题,请参考以下文章
如何从Python Tkinter应用程序中捕获任何输出到控制台?
如何从 Python Tkinter 应用程序捕获到控制台的任何输出?
Python3 tkinter基础 Entry get 点击按钮 将输入框中文字输出到控制台