Python 将消息记录到pygtk.entry

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

我目前正在为我的python应用程序开发gtk GUI。我想实现一个简单的文本输入,它将包含应用程序的所有日志消息(类似于GUI中的控制台日志窗口)。不幸的是,我只能创建将日志消息打印到文件或控制台输入的日志处理程序:

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”作为“处于这种情况的人”。顺便说一句,如果不明显的话,我不是选民。