将消息记录到 pygtk.entry

Logging messages to pygtk.entry

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

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 Entry 中的记录器处理程序?

如果您想要一个简单的解决方案,我建议您使用 GtkLabel。 Label 可以显示多行文本,而且,如果你想突出显示某些内容,Label 也接受标记(HTML-like 标签)。

一种更复杂的方法是使用 GtkTextView 小部件。基本上你写入一个 GtkTextBuffer,你之前连接到 GtkTextView 以在屏幕上显示它。有了这个小部件,您就有了更多的可能性,但您需要付出更多的复杂性。

举个例子。它很长,因为必须创建 MainWindow 才能使其可运行。使用 Label 和 packing 属性将文本对齐到您喜欢的位置。

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()

日志条目是在主程序中人为添加的,否则我必须添加更多的小部件。我已经覆盖了 warning 方法来展示如何做到这一点。您还可以覆盖 info 和其他处理程序。

请注意,正如 user4815162342 在下面指出的那样,使用标签的方法对于很长的日志可能不是最佳选择。您可以使用 gtk.TextBuffer 来做同样的事情,或者通过在处理程序中保存文本的副本、向其中添加新消息并重新加载标签的文本来改进上述程序。

无论如何,我怀疑问题是关于如何将日志文本发送到文件或终端以外的其他地方。