【问题标题】:How to set existing text from a variable within a function? Python Kivy如何从函数中的变量设置现有文本?蟒蛇基维
【发布时间】:2019-02-08 17:02:46
【问题描述】:

我创建了一个打开日志文件的函数,并将其保存到名为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)

基维文件:

<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'。我很困惑和卡住,任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 在你的 reset_text 函数中,你应该明确地改变你的 TextInput 的文本(那个时候带有id: logginfo 的那个)。此外,您能否发布更多代码 - 例如您在哪里定义 App 类等?如果我们可以复制/粘贴您的代码以自行调试,您将得到更好的答案,如下所示:stackoverflow.com/help/mcve
  • @Erik 如何从我的 python 文件中显式更改 TextInput 中的文本?日志信息.文本?对于我的 App 类,我使用 Builder.load_file 来加载 kivy 文件。然后在构建函数中,我只返回 kivy 文件。
  • 关闭 - 要引用您的 TextInput,您必须使用类似 App.get_running_app().root.ids['logginfo'].text = loginfo 的方式引用它。试着把它放在你的 reset_text 函数中。
  • @Erik 你写“关闭 - ”是什么意思?当我添加该行并运行时,我得到`KeyError:'logginfo'`
  • 我的意思是你已经接近找到正确的解决方案了。如果您收到 KeyError,我知道出了什么问题,但我需要查看您的更多代码。您可以编辑您的答案以获得更完整的 kv 文件吗?

标签: python python-3.x kivy textinput


【解决方案1】:

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

注意我是如何使用 Clock.schedule_interval 而不是安排一次的。 schedule_interval 中的1 是调用self.reset_text 函数之间的时间,以秒为单位。请注意如何在reset_text 函数中使用self.root(GridLayout)在我的kv 文件中引用我的基本小部件,然后我可以通过执行self.root.ids['my_text_input']

ma​​in.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()

ma​​in.kv

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

【讨论】:

  • 哇,这很有意义。这在我将 my_text_input 放在根 BoxLayout 中时有效,但当我将它放在由根中的屏幕管理器调用的屏幕中时不起作用......这也是有道理的,因为它不在根中。所以在我的reset_text 函数中,我可以指定不同的路径吗?例如,self.root.screenmanage.thescreen.ids['my_text_input'].text = f.read() 定位屏幕的正确方法是什么?
  • 你的逻辑是对的!你需要给你的 Screen 一个 id。然后您可以执行self.root.ids['my_screen_id'].ids['my_text_input'] 来引用该屏幕中的文本输入。这是因为您的屏幕位于根小部件中,而您的文本输入位于屏幕小部件中。希望这是有道理的!
  • 我在这里有一个视频:youtube.com/watch?v=AU8jjgzH1LE&t=358s 仅供参考!
猜你喜欢
  • 1970-01-01
  • 2022-11-06
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多