在将stdout重定向和记录输出到tkinter文本小部件上花费了一些时间后,我决定需要一些帮助。我的代码如下:
#!/usr/bin/env python
from Tkinter import *
import logging
from threading import Thread
class IODirector(object):
def __init__(self,text_area):
self.text_area = text_area
class StdoutDirector(IODirector):
def write(self,str):
self.text_area.insert(END,str)
def flush(self):
pass
class App(Frame):
def __init__(self, master):
self.master = master
Frame.__init__(self,master,relief=SUNKEN,bd=2)
self.start()
def start(self):
self.master.title("Test")
self.submit = Button(self.master, text='Run', command=self.do_run, fg="red")
self.submit.grid(row=1, column=2)
self.text_area = Text(self.master,height=2.5,width=30,bg='light cyan')
self.text_area.grid(row=1,column=1)
def do_run(self):
t = Thread(target=print_stuff)
sys.stdout = StdoutDirector(self.text_area)
t.start()
def print_stuff():
logger = logging.getLogger('print_stuff')
logger.info('This will not show')
print 'This will show'
print_some_other_stuff()
def print_some_other_stuff():
logger = logging.getLogger('print_some_other_stuff')
logger.info('This will also not show')
print 'This will also show'
def main():
logger = logging.getLogger('main')
root = Tk()
app = App(root)
root.mainloop()
if __name__=='__main__':
main()
我知道可以基于文本小部件定义一个新的日志处理程序,但我无法使其正常工作。函数“print_stuff”实际上只是许多不同函数的包装器,每个函数都有自己的记录器设置。我需要帮助定义一个新的日志处理程序,它是“全局”的,以便可以从具有自己日志记录器的每个函数中实例化。非常感谢您的帮助。
pack
的调用,否则您只能在使用pack的框架中使用此类。通常情况下,如果创建小部件的函数也负责其布局,那么您的代码将更易于使用,而不是让小部件自己进行布局。 - Bryan Oakley