Kivy Scrollable标签和文本文件,标签不会更新

时间:2016-03-17 10:21:44

标签: python-3.x label scrollview kivy

Hy,问题在于,使用当前的代码,在这一点上,除了文本编辑器之外什么都没有,当我尝试用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()

1 个答案:

答案 0 :(得分:0)

为什么会这样:

您的主屏幕中的text已从文件更新,然后传递给Label并加载了文本。 ScrollableLabel.text保持不变。

为什么它不能按预期工作:

您的课程之间没有任何通信,因此只有text更改为实际self.text = MainScreen.text

如何使其发挥作用:

在全局范围内使用某些内容,即App类中的变量,然后a = App.get_running_app()a.<variable>访问变量,或使用__init__初始化您的ScrollableLabel MainScreen并将text

传递给它

所以它基本上是this的副本,而且是一个较旧的简单问题的副本。