【问题标题】:How to print messages in tkinter from subprocess?如何从子进程打印 tkinter 中的消息?
【发布时间】:2021-05-10 01:30:29
【问题描述】:

大家!我遇到了一个问题。假设我有一个使用 tkinter giu 的子进程模块启动的脚本,如下所示(参数包括脚本的名称):

p = Popen(['python.exe'] + params)

在执行期间,我的脚本有一些我想在我的 gui 中打印的消息。当我使用控制台时,我只是用这样的打印功能做到了:

print(f'Connected to {ppm_file}')

我现在需要做的是让这条消息打印在 tkinter gui 的文本小部件中。

我想这意味着使用标准输出,但我是这个概念的新手,觉得有点难以理解。

感谢您的帮助!

【问题讨论】:

    标签: python tkinter scripting subprocess popen


    【解决方案1】:

    在文本小部件中,您可以使用以下方法插入:

    txtbox.delete('1.0', END) # to remove any preceding text(ignore if empty)
    txtbox.insert(END, 'Connected to {ppm_file}')  # insert the text you want
    txtbox.insert(END, '\n') # additional insertion for example a newline character
    

    【讨论】:

    • 但是如何从另一个进程中获取这些字符串?
    • 您可以将相关值返回到主脚本然后插入,更多详情请参考:stackoverflow.com/questions/30664263/…
    • 您提供的链接几乎涵盖了我的需求,但我的脚本中都有这些打印件,因为它们指示了进程状态。据我了解,那里的问题涵盖了打印功能何时结束的情况。
    • 嗯,你可以在dictlist中积累所有的进程状态,然后返回后,遍历它并插入到输出文本框中。
    • 是的,现在我找到了你。我想 OOP 是目前最好的方法,虽然它需要大量的重写)))还是非常感谢!
    【解决方案2】:

    您可以捕获外部脚本的控制台输出并将捕获的输出插入到Text 小部件中。

    下面是一个例子:

    import tkinter as tk
    import subprocess
    import threading
    
    root = tk.Tk()
    
    logbox = tk.Text(root, width=80, height=20)
    logbox.pack()
    
    def capture_output():
        # "python -u" make stdout stream to be unbuffered
        p = subprocess.Popen(["python", "-u", "other.py"], stdout=subprocess.PIPE)
        while p.poll() is None: # process is still running
            logbox.insert("end", p.stdout.readline())
            logbox.see("end")
        logbox.insert("end", "--- done ---\n")
    
    # use thread so that it won't block the application
    tk.Button(root, text="Run", command=lambda: threading.Thread(target=capture_output, daemon=True).start()).pack()
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2010-10-04
      • 2019-09-22
      • 2016-03-16
      相关资源
      最近更新 更多