重定向/复制python和kivy的登录到文本输入上



在我正在开发的应用程序的一部分,我希望能够用户查看python &kivy输出查看可能已引起的任何类型的警告或问题。

我搜索了这个,关于这个只有一个stackoverflow问题:所以重定向python日志到kivy标签的问题

我尝试了完全相同的代码(作为答案检查的那个),但我得到的只是一个标签,上面写着WOO %和一个计时器作为最后一个字符。

我有一个想法,那就是访问,即kivy写入的日志记录。但实际上它不会工作,因为我应该访问文件多长时间?我应该创建一个while True: read_file()循环,并把它放在另一个线程和运行它永远吗?最终,这不是一个好主意。

如果是我的代码:

from kivy.lang import Builder
from kivy.app import App

class MainApp(App):
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
self.kv = Builder.load_string('''
#:kivy 2.0.0
TextInput:
# redirect (preferably copy) logger text here
id: logger_text
readonly: True
''')
def build(self):
return self.kv

if __name__ == '__main__':
MainApp().run()

我如何重定向(但最好复制)这个记录器到我的文本输入?

你可以使用你引用的50个问题中的概念。这里是一个修改版本的答案,使用你的kivy代码:

import logging
from kivy.lang import Builder
from kivy.logger import Logger
from kivy.app import App
from kivy.clock import Clock

class MyLabelHandler(logging.Handler):
def __init__(self, label, level=logging.NOTSET):
super(MyLabelHandler, self).__init__(level=level)
self.label = label
def emit(self, record):
"using the Clock module for thread safety with kivy's main loop"
def f(dt=None):
self.label.text += self.format(record) + 'n' #"use += to append..."
Clock.schedule_once(f)

class MainApp(App):
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
self.kv = Builder.load_string('''
FloatLayout:  # added because `id` on root object has no effect
TextInput:
# redirect (preferably copy) logger text here
id: logger_text
readonly: True
''')
def build(self):
# use Kivy Logger
Logger.level = logging.INFO
Logger.addHandler(MyLabelHandler(self.kv.ids.logger_text, logging.INFO))
# send some logging from this app
Clock.schedule_interval(self.send_log, 2)
return self.kv
def send_log(self, dt):
#  This is just to demonstrate some logging fom this App
Logger.info('MyApp: this is a test at ' + str(dt) + ' seconds')
logging.info('this is a python log')

if __name__ == '__main__':
MainApp().run()

相关内容

最新更新