Python Kivy self.add_widget() 在代码 运行 时不更新

Python Kivy self.add_widget() doesn't update while code running

我们的想法是创建一个类似于 Messenger 的短信应用程序。我的聊天记录有问题,它是一个包含所有先前文本的“BoxLayer(或 GridLayer)”。我希望当我 插入 新文本时,它会 出现 作为新标签或框,并且 保持在 [=28 以下=] previous text 就像这样,但是当我 运行 代码并插入输入文本时,它没有出现。我花了几个小时自己和在互联网上找到答案,但对于像我这样的初学者来说有点困难。

.py文件

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.core.image import Image
from kivy.properties import StringProperty
from kivy.core.window import Window
from kivy.graphics.context_instructions import Color

class MainWidget(Widget):
    request = StringProperty("This is a previous text, don't mind")
    insert_text = StringProperty("Insert Here")
    window_size = (305,400)
    refresh_key = False
    
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.Window_Minimum()
    
    def on_size(self,*args):
        print(self.width,self.height)
    
    def on_text_validate(self,widget): #<<<<<<<<<<<<<<<<<<<<<<<<<<< input text
        request=widget.text
        Chat_history_update().chat_history(request)
        
    def Window_Minimum(self):
        Window.minimum_width,Window.minimum_height=self.window_size

class Chat_history_update(BoxLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        l = Label(text="This is a previous text, don't mind",size_hint=(1, None),height=("30dp"))
        self.add_widget(l)
        
    def chat_history(self,request): # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Add Label Function
        l = Label(text=request, size_hint=(1, None),height=("30dp"))
        self.add_widget(l) # <<<<<<<<<<<<< This won't update my app screen

class Assistant(App):
    pass

if __name__ == "__main__":
    Assistant().run()

Kv 文件

MainWidget:

<MainWidget>:
    BoxLayout:
        size: root.size
        orientation: "vertical"
        GridLayout:
            cols: 3
            size_hint: 1,None
            height: "50dp"
            spacing: "10dp"
            padding: "10dp"
            Label:
                text:"Erza Assistant"
            Button:
                text:"Edit Path"
            Button:
                text:"Setting"
        GridLayout:
            size: self.size
            rows: 2
            spacing: "10dp"
            padding: "10dp"
            ScrollView: #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Here my text display
                Chat_history_update:
                    orientation: "vertical"
                    size_hint: 1, None
                    height: self.minimum_height

            TextInput:
                size_hint: 1, None
                height: "40dp"
                text: root.insert_text
                multiline: False
                on_text_validate: root.on_text_validate(self)

您的代码:

Chat_history_update().chat_history(request)

正在创建 Chat_history_update 的新实例,并为该新实例调用 chat_history()。该新实例不是您的 GUI 的一部分,因此您看不到任何效果。解决方法是访问 Chat_history_update 的正确实例(GUI 中的实例)。为此,您可以在 kv:

中添加一个 id
        ScrollView: #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Here my text display
            Chat_history_update:
                id: chu
                orientation: "vertical"
                size_hint: 1, None
                height: self.minimum_height

然后在您的 py 代码中使用 id

def on_text_validate(self,widget): #<<<<<<<<<<<<<<<<<<<<<<<<<<< input text
    request=widget.text
    self.ids.chu.chat_history(request)

我认为这 here 可能会有所帮助。您必须使用 idids.

引用 kivy 语言的小部件

如果您还没有,我强烈建议您学习如何通过 ID 引用小部件。