控制台输出为 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 点击按钮 将输入框中文字输出到控制台

使用 Pyinstaller 冻结 Python 程序时摆脱控制台输出

如何在tkinter中并排打包3个单选按钮和1个标签?

tkinter 画布文本输出