这是困扰我的是什么:
我尝试将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()
答案 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()方法以仅更新文本选项...