Kivy 可滚动标签和文本文件,标签不会更新

Kivy Scrollable Label and text file, label wont update

嘿,问题在于当前的代码,在这一点上除了文本编辑器外什么都没有,每当我尝试用 kv 语言制作一个可滚动的标签并在主屏幕上调用它时按下按钮,我没有收到任何错误,那里什么也没有。我应该提一下,文本是从一个存储的文件中提取的,唯一有效的版本是带有常规标签的。这是代码,我知道它有点长,但它很容易理解,所以请继续阅读。非常感谢任何类型的输入,感谢您抽出宝贵时间。

#kivy.require("1.8.0")
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.uix.scatter import Scatter
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Line
from kivy.uix.gridlayout import GridLayout


kv = '''
#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManager:
    transition: FadeTransition()
    MainScreen:
    AddScreen:
    AppendScreen:


<ScatterTextWidget>:
    orientation: 'vertical'

    TextInput:
        id: main_input
        font_size: 14
        size_hint_y: None
        height: root.height - botones_layout.height
        font_color: [0.1,0.3,0.9,1]
        focus: True
        foreground_color: [0.2,0.5,0.9,1]
        cursor_color: [0,0,1,1]

    BoxLayout:
        id: botones_layout
        orientation: 'horizontal'
        height: 30
        Button:
            id: home_button
            text: "Back Home"            
        Button:
            id: save_button
            text: "Save to file"
            on_press: root.saveToFile("Archive.txt", main_input.text)


<AppendTextWidget>:
    orientation: 'vertical'

    TextInput:
        text: root.text
        id: main_input
        font_size: 14
        size_hint_y: None
        height: root.height - botones_layout.height
        font_color: [0.1,0.3,0.9,1]
        focus: True
        foreground_color: [0.2,0.5,0.9,1]
        cursor_color: [0,0,1,1]

    BoxLayout:
        id: botones_layout
        orientation: 'horizontal'
        height: 30
        Button:
            id: home_button
            text: "Back Home"
            on_release: app.root.current = "main"
        Button:
            id: save_button
            text: "Save"
            on_press: root.append(main_input.text)

#This does not work <--- <--- <---

<ScrollableLabel>:
    Label:
        text: root.text
        font_size: 15
        text_size: self.width, None
        color: [0,255,0,1]
        padding_x: 20
        size_hint_y: None
        pos_hint: {"left":1, "top":1}
        height: self.texture_size[1]


<MainScreen>:
    name: "main"
    FloatLayout:

        # This does work 

        Label:
            text: root.text
            font_size: 15
            text_size: self.width, None
            color: [0,255,0,1]
            padding_x: 20
            size_hint_y: None
            pos_hint: {"left":1, "top":1}
            height: self.texture_size[1]        

    ActionBar:
        pos_hint: {'top':1}
        ActionView:
            use_separator: True
            ActionPrevious:
                title: "Text"
                with_previous: False
            ActionOverflow:
            ActionButton:
                text: "New"
                on_release: app.root.current = "add"
            ActionButton:
                text: "Update"
                on_press: root.clicked()
            ActionButton:
                text: "Add"
                on_release: app.root.current = "append"


<AddScreen>:
    name: "add"
    FloatLayout:
         ScatterTextWidget

<AppendScreen>:
    name: "append"
    FloatLayout:
        AppendTextWidget        

'''


class ScatterTextWidget(BoxLayout):
    def saveToFile(self,name,text):
        f = open(name, "w")
        f.write("\n\n\n" + "    " + ">>>" + text + "test"*500)
        f.close()

class AppendTextWidget(BoxLayout):
    text = StringProperty("")
    def append(self,text):
        with open("Archive.txt", "a") as f:
            f.write("\n" + "    " + ">>>" + text)
            f.close()



 class ScrollableLabel(ScrollView):
     text = StringProperty('')
     pass


class MainScreen(Screen):
    text = StringProperty("")

    def clicked(self):
        with open("Archive.txt", "r") as f:
            contents = f.read()
            self.text = contents
    pass

class AddScreen(Screen):
    pass

class AppendScreen(Screen):
    pass    

class MyApp(App):

    def build(self):
        return Builder.load_string(kv)



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

为什么有效:

MainScreen 中的 text 从文件更新,然后传递给 Label 并加载文本。 ScrollableLabel.text保持不变。

为什么它没有像您预期的那样工作:

你们的 class 之间没有通信,因此只有 text 改变了一个实际的 self.text = MainScreen.text

如何让它发挥作用:

要么在全局范围内使用某些东西,即 App class 中的变量,然后 a = App.get_running_app() 并通过 a.<variable> 访问变量,或者使用 __init__在 MainScreen 中初始化您的 ScrollableLabel 并将其传递给 text

所以它基本上是 this 的副本,而那个是旧的未简化问题的副本。