我尝试将stdout重定向到tkinter标签小部件,但文本未正确更新

时间:2015-08-07 05:16:22

标签: python redirect tkinter label stdout

这是困扰我的是什么: 我尝试将stdout重定向到tkinter Label ....但它不起作用。当我按下按钮而不是“按钮点击”时,我只得到了空白区域。 最奇怪的是当我使用文件来存储输出然后我读它并将文件文本放在Label中时,一切正常! 我的问题:为什么直接重定向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()

1 个答案:

答案 0 :(得分:1)

它确实按照您的请求设置了标签文本,但随后将文本更改为换行符,第二次调用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类config()方法以仅更新文本选项...