【问题标题】:Widget to Display subprocess stdout?显示子进程标准输出的小部件?
【发布时间】:2011-12-29 07:53:12
【问题描述】:

我有一个基于 python 的 tkinter 脚本,它使用 subprocess 模块执行一些命令。 我需要在 GUI 本身上显示标准输出。 由于我是 tk 的新手(一周粗体 :)),我需要您的建议我应该如何进行。 我有两个疑问:

  1. 我应该学习哪个小部件来显示标准输出。
  2. 如何将子进程的标准输出链接到您提到的小部件。

【问题讨论】:

  • 子流程是快速运行还是长时间运行?
  • 长时间运行,该过程可能需要5-10分钟才能执行。

标签: python tkinter tk


【解决方案1】:

您可能想要使用Tkinter.Text 小部件,描述为here

描述很长,但你需要了解的主要是这个小部件可以用作缓冲区,因为里面应该插入文本。

因此,对于subprocess 输出中的每一行,您都必须在需要的位置插入文本。示例:

t = Tkinter.Text(root)
while some_condition:
    s = p.readline()          # get subprocess output
    t.insert(END, s)

编辑a look here 用于逐行获取子进程输出。

您可能还想查看Tkinter.ScrollbarText.see() 来调整显示。

【讨论】:

  • 虽然这是所需内容的大纲,但您希望在处理过程中保持 GUI 处于活动状态。这使得事情变得相当复杂(虽然不像你想与子流程交互那么复杂;有很多微妙之处)。
  • 没错,保持活动有点不同,因为必须刷新 GUI。但这更依赖于应用程序:GUI 是程序的根,还是只是一个显示器?这将有两个不同的答案,使用root.after() 或访问t 属性。
  • 大家好,感谢您的回复。我会查看链接并回复您。实际上我有一个巨大的 csh 脚本,使用起来非常复杂。使用 GUI,我试图将用户与复杂性隔离开来。因此,必须让用户实时执行 csh 脚本。
  • 我昨天按照你的建议尝试了类似的实现,唯一的问题是我只有在控制台中完成执行后才能在文本框中获取标准输出。
  • 我的第一次编辑中链接的问题中给出的答案是否有效?第二个问题,你能发布你到目前为止的代码吗?使用 GUI 有一个小技巧,因为它们不是程序性的,而是事件驱动的(我希望我有正确的术语)。
猜你喜欢
  • 2013-11-27
  • 2013-02-28
  • 2014-11-03
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多