如何从函数中的变量设置现有文本? Python 基维

How to set existing text from a variable within a function? Python Kivy

我创建了一个打开日志文件的函数,并将其保存到名为 loginfo 的变量中。在我的 kivy 文件中,我有一个 TextInput 小部件。我尝试将现有的 text: 设置为 root.loginfo.

loginfo 需要在函数内,因为我正在使用 kivy 的时钟重新读取日志文件。

Python 文件:

class Tasks(Screen):
    logginfo = ObjectProperty()

    def reset_text(dt):
        with open('logtest.log', 'r') as file:
            loginfo = file.read()

    Clock.schedule_once(reset_text, -1)

Kivy 文件:

<Tasks>:
    name: 'task'
    logginfo: logginfo
    BoxLayout:
        orientation: "vertical"
        Label:
            text: "TASKS"

        TextInput:
            id: logginfo
            text: root.loginfo

当我创建 reset_text(dt) 函数和 kivy.clock 时,问题开始出现。如果没有函数,只有它的内容,文本输入框会正确显示 logtest.log 文件的内容。

当我 运行 脚本时,它给了我 AttributeError: 'NoneType' object has no attribute 'replace'。我很困惑和困惑,任何帮助将不胜感激。提前致谢。

这里有一个完整的例子来做你想做的事。您必须修改它以将其与您的代码集成,但我在这里的目的是向您展示实现此目的的正确方法并让您自己使用它。

请注意我是如何使用 Clock.schedule_interval 而不是 schedule once 的。 schedule_interval 中的 1 是调用 self.reset_text 函数之间的时间间隔,以秒为单位。请注意,在 reset_text 函数中,我如何使用 self.root(GridLayout)在我的 kv 文件中引用我的基本小部件,然后我可以获得 TextInput(因为我给了它一个 ID)通过 self.root.ids['my_text_input']

main.py

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

GUI = Builder.load_file("main.kv")

class MainApp(App):
    def build(self):
        Clock.schedule_interval(self.reset_text, 1) # Check if log has changed once a second
        return GUI

    def reset_text(self, *args):
        with open("logtest.log", "r") as f:
            self.root.ids['my_text_input'].text = f.read()

MainApp().run()

main.kv

GridLayout:
    # This is the 'root' widget when referenced in python file
    cols: 1
    TextInput:
        id: my_text_input