Kivy Scrollable Label and text file, label wont up

2019-09-06 07:27发布

问题:

Hy, the problem is that with the current code, which is at this point preety much nothing but a text editor, when ever I try to make a scrollable label in the kv language and call it on the main screen at the push of a button, I get no error, theres just nothing there. I should mention that the text is taken from a stored file, and the only version that works is with a regular label. This is the code, I know its a bit long but its preety easy to understand so stay with me. Any sort of input is greatly apreciated and I thank you for taking the time.

#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()

回答1:

Why it works:

Your text in MainScreen is updated from file, then passed to Label and the text is loaded. ScrollableLabel.text stays unchanged.

Why it doesn't work as you expect:

There's no communication between your classes, therefore only text changed is an actual self.text = MainScreen.text

How to make it work:

Either use something on a global range, i.e. variable in your App class, then a = App.get_running_app() and access variable through a.<variable> or use __init__ to initialize your ScrollableLabel inside the MainScreen and pass it the text

So it's basically a duplicate of this and that one is a duplicate of an older unsimplified question.