我试图将标准输出重定向到 tkinter 标签小部件,但文本未正确更新

I tried to redirect stdout to tkinter label widget but text is not updated correctly

这是困扰我的问题: 我尝试将 stdout 重定向到 tkinter Label... 但它不起作用。当我按下按钮而不是 "Button clicked" 时,我只得到空白 space。 最奇怪的是当我使用文件存储输出然后我读取它并将文件文本放入标签时一切正常! 我的问题:为什么 stdout 的直接重定向不适用于此处的小部件?

from tkinter import *
import sys


class MyLab(Label):
    def write(self, txt):
        '''here is a deal when I use this >hack< label is updated:'''
        f=open("test.txt","a")
        f.write(txt)
        f.close()
        f=open("test.txt")
        x = f.readlines()[-1]
        self.config(text=x) # this works!

   #     self.config(text=txt) # but this doesn't .... of course you need
   #     to  switch off above 'file' method
        f.close()



root = Tk()

w = MyLab(root, text="1st", height=5, width = 20)
sys.stdout = w #redirecting stdout to MyLab instance
t = Entry(root, text='cos')

def btn_clck():
    print('Button clicked!!!') # text should be puted in label

b = Button(root, text='PRESS ME', command = btn_clck, height = 5, width = 20)
b.pack()
t.pack()
w.pack()

root.mainloop()

它实际上确实按照您的要求设置了标签文本,但随后通过第二次调用 write 将文本更改为换行符,因为那是字符串终止符 - 请参阅 Python 3 docs for print().

您可以修改 write() 方法以仅设置不是单个换行符的文本:

class MyLab(Label):
    def write(self, txt):
        if txt != "\n": self.config(text=txt)

或者您可以更改 print() 调用以传递一个空字符串作为终止符,然后 write() 可能更简单:

def btn_clck():
    print('Button clicked!!!', end='')

class MyLab(Label):
    def write(self, txt):
        if txt: self.config(text=txt)

您甚至可以考虑覆盖 Label class config() 方法,以便仅在提供的参数不为空或换行符时更新文本选项...