Python 将消息记录到pygtk.entry
我目前正在为我的python应用程序开发gtk GUI。我想实现一个简单的文本输入,它将包含应用程序的所有日志消息(类似于GUI中的控制台日志窗口)。不幸的是,我只能创建将日志消息打印到文件或控制台输入的日志处理程序:Python 将消息记录到pygtk.entry,python,python-2.7,logging,gtk,pygtk,Python,Python 2.7,Logging,Gtk,Pygtk,我目前正在为我的python应用程序开发gtk GUI。我想实现一个简单的文本输入,它将包含应用程序的所有日志消息(类似于GUI中的控制台日志窗口)。不幸的是,我只能创建将日志消息打印到文件或控制台输入的日志处理程序: def create_logger(logfile): logger = logging.getLogger("MyApp") file_logging = logging.FileHandler(logfile) file_logging.setLev
def create_logger(logfile):
logger = logging.getLogger("MyApp")
file_logging = logging.FileHandler(logfile)
file_logging.setLevel(logging.INFO)
logger.addHandler(file_logging)
console_logging = logging.StreamHandler()
console_logging.setLevel(logging.INFO)
logger.addHandler(console_logging)
return logger
是否有任何方法可以设置将消息记录到Gtk条目中的记录器处理程序 如果您想要一个简单的解决方案,我建议您使用GtkLabel。标签可以显示多行文本,如果您想突出显示某些内容,标签还可以接受标记(类似HTML的标记) 更复杂的方法是使用GtkTextView小部件。基本上,您可以写入GtkTextBuffer,之前连接到GtkTextView以在屏幕上显示它。有了这个小部件,你就有了更多的可能性,你需要付出更大的代价 这里有一个例子。它很长,因为创建主窗口是使其可运行所必需的。使用“标签”和“包装”属性将文本对齐到需要的位置
import logging
import pygtk
import gtk
class MyHandler(logging.Handler):
def __init__(self, label):
logging.Handler.__init__(self)
self.label = label
def handle(self, rec):
original = self.label.get_text()
self.label.set_text(rec.msg + "\n" + original)
class MyLogger():
def __init__(self, label):
self.logger = logging.getLogger("Example")
self.handler = MyHandler(label)
#self.handler.setLevel(logging.INFO)
self.logger.addHandler(self.handler)
def warning(self, msg):
self.logger.warning(msg)
class MainWindow(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
self.set_size_request(200, 100)
self.connect("delete-event", self.on_delete_event)
self.loglabel = gtk.Label()
self.add(self.loglabel)
self.show_all()
def run(self):
gtk.mainloop()
def on_delete_event(self, w, d):
gtk.main_quit()
def main():
mw = MainWindow()
logger = MyLogger(mw.loglabel)
logger.warning("This is a test message")
logger.warning("This is another message")
mw.run()
return 0
if __name__ == '__main__':
main()
日志条目是人为地添加到主程序中的,否则我必须添加更多的小部件。我已经重写了警告
方法来演示如何执行此操作。您还可以覆盖信息
和其他处理程序
注意,正如user4815162342在下面指出的,对于很长的日志,使用标签的方法可能不是最佳的。您可以使用gtk.TextBuffer执行相同的操作,或者通过在处理程序中保存文本副本、向其中添加新消息并重新加载标签文本来改进上述程序
无论如何,我怀疑问题在于如何将日志文本发送到文件或终端以外的其他地方。GtkEntry只显示一行文本。您需要的是GtkTextView。您应该解释如何结合小部件设置记录器处理程序,而不仅仅是描述一些gtk小部件。OP几乎肯定想要写入文本视图,错误地称为“条目”。标签示例是危险的,因为它具有O(n^2)复杂性,因为它必须构造越来越大的字符串,因此一旦开始认真的日志记录,就会中断应用程序。将示例转换为使用
gtk.TextView
,这在算法上是有意义的,并且满足OP提出的要求是很简单的(虽然文本视图确实比标签更复杂,但在这个特定示例中,实现复杂性不会改变)@user4815162342我想知道OP是否还在读这个线程。他在两天前发布了这个问题。这很难说,但无论OP是否还在那里阅读,改进答案都是有意义的;许多人在几年后通过谷歌搜索找到回复。(我知道在我注册回复如此多的答案之前我做了很多。)如果这让我的评论更容易解析,请随意阅读“OP”作为“处于这种情况的人”。顺便说一句,如果不明显的话,我不是选民。