Как установить существующий текст из переменной внутри функции?Питон Киви - PullRequest
0 голосов
/ 08 февраля 2019

Я создал функцию, которая открывает файл журнала и сохраняет его в переменной с именем 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.Без функции и только ее содержимого поле textinput правильно отображает содержимое файла logtest.log.

Когда я запускаю скрипт, он дает мне AttributeError: 'NoneType' object has no attribute 'replace'.Я запутался и застрял, любая помощь будет оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Вот полный пример того, что вы хотите сделать.Вам нужно будет изменить его, чтобы интегрировать с вашим кодом, но я хотел показать вам правильный способ достижения этого и позволить вам работать с ним самостоятельно.

Обратите внимание, как я использую Clock.schedule_interval вместо расписания один раз.1 в schedule_interval - это время между вызовом функции self.reset_text в секундах.Обратите внимание, что в функции reset_text я могу ссылаться на свой базовый виджет в моем файле kv, используя self.root (GridLayout), затем я могу получить TextInput (так как я дал ему идентификатор), выполнив 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
...