当前位置: 首页 > 面试题库 >

在Tkinter小部件中显示子流程的实时输出

陈马鲁
2023-03-14
问题内容

我有以下代码(python2.7):

def btnGoClick(p1):
    params = w.line.get()
    if len(params) == 0:
        return

    # create child window
    win = tk.Toplevel()
    win.title('Bash')
    win.resizable(0, 0)
    # create a frame to be able to attach the scrollbar
    frame = ttk.Frame(win)
    # the Text widget - the size of the widget define the size of the window
    t = tk.Text(frame, width=80, bg="black", fg="green")
    t.pack(side="left", fill="both")
    s = ttk.Scrollbar(frame)
    s.pack(side="right", fill="y")
    # link the text and scrollbar widgets
    s.config(command=t.yview)
    t.config(yscrollcommand=s.set)
    frame.pack()

    process = subprocess.Popen(["<bashscript>", params], shell=False,
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        out = process.stdout.readline()
        if out == '' and process.poll() is not None:
            break
        print out
        t.insert(tk.END, out)

“ longrunning” bash脚本的输出是实时捕获的(显示在控制台中),但是Tkinter窗口仅在子进程结束后显示!

如何在子进程启动之前实时显示窗口并更新其内容?


问题答案:

终于我找到了解决方案。窗口构建后,必须添加

frame.pack()
# force drawing of the window
win.update_idletasks()

然后,在小部件中插入每行之后,还必须仅在小部件上使用相同的方法强制刷新。

# insert the line in the Text widget
t.insert(tk.END, out)
# force widget to display the end of the text (follow the input)
t.see(tk.END)
# force refresh of the widget to be sure that thing are displayed
t.update_idletasks()


 类似资料:
  • 问题内容: 我正在尝试创建一个程序,该程序执行一系列给定的用户输入。仅在某些情况下才需要几个用户输入,并且如果可能的话,我想仅在选择一个Checkbutton(表示存在要求这些输入的情况)时显示这些输入值的Entry框和Labels。我不确定该怎么做: 将我要添加的标签和条目框放在已经存在的行之间。 取消选中“选择”按钮时,“隐藏”标签和输入框,而不进行选择,这样,如果重新选择“选择”按钮,则可以

  • 问题内容: 我想知道如何根据某些模式来更改某些单词和表达式的样式。 我正在使用小部件,但不确定如何执行此操作(与文本编辑器中语法高亮显示的想法相同)。即使这是用于此目的的正确小部件,我也不确定。 问题答案: 这是用于这些目的的正确小部件。基本概念是,将属性分配给标签,然后将标签应用于小部件中的文本范围。您可以使用文本小部件的命令来查找与您的模式匹配的字符串,这将为您返回足够的信息,将标记应用于匹配

  • 问题内容: 我想在GUI上显示程序的“实时”输出(显示在其中的所有内容)。如何访问我的输出?以及在文本框中显示它的正确方法是什么? 编辑:我哪里错了?(我希望“ hello world”出现在文本框中。(Test2是正在运行的程序)) 问题答案: 我花时间调试和修改了我对另一个问题的0)答案中的模块,因此它可以在Python 2 和 3中工作—链接答案中的代码是针对Python 2.x编写的。请注

  • 问题内容: 我正在使用python脚本作为水动力代码的驱动程序。是时候运行模拟了,我用来运行代码,将和的输出收集到中,然后我可以打印(并保存到日志文件中)输出信息,并检查是否有错误。问题是,我不知道代码是如何进行的。如果我直接从命令行运行它,它将为我提供有关其迭代次数,时间,下一时间步长等的输出。 有没有办法既存储输出(用于日志记录和错误检查),又产生实时流输出? 我的代码的相关部分: 最初,我是

  • 我正在尝试用tkinter构建一个navigator应用程序,并且对于制作GUI和一般使用tkinter非常陌生。当整个窗口调整大小时,我似乎不知道如何很好地调整小部件的大小。当前调整大小的工作方式如下图所示。 顶部的描述是一个tkinter消息小部件,中间的导航树是一个检查表,两个按钮是常规按钮,按钮下面的文本是一个标签对象。我把这些放在tkinter根中。grid()方法,并根据需要使用ipa

  • 问题内容: 我正在尝试制作一个Python程序,您可以在其中移动小部件。 这是我的代码: 但是,这会出现小故障,并且小部件来回跳转。 谢谢! 问题答案: 您观察到的行为是由于事件的坐标相对于拖动的小部件而引起的。用 相对 坐标更新小部件的位置(在 绝对 坐标中)显然会导致混乱。 __ 为了解决这个问题,我使用了和函数(允许将相对坐标转换为绝对坐标),并使用事件来确定拖动开始时光标在小部件上的位置。