2016-03-17 149 views
0

Hy,问题是用当前的代码,在这一点上,它只是一个文本编辑器,当我试图制作一个可滚动的kv语言标签并在按下按钮的情况下在主屏幕上调用它,我没有任何错误,这些都没有。我应该提到,文本是从存储文件中提取的,唯一适用的版本是常规标签。这是代码,我知道它有点长,但其易懂易懂,所以留在我身边。任何类型的输入都非常令人满意,我感谢您花时间。Kivy Scrollable标签和文本文件,标签不会更新

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

回答

0

为什么它的工作原理:

text在MainScreen从文件更新,然后传递到标签和文本被加载。 ScrollableLabel.text保持不变。

为什么它作为你希望不工作:

有你的类之间没有交流,因此只text改变的是一个实际的self.text = MainScreen.text

如何使其工作:

无论是使用全局范围内的东西,即变量App类,然后a = App.get_running_app()和访问变量通过a.<variable>或使用__init__初始化您的MainScreen中的ScrollableLabel和pa它的text

所以它基本上是this的副本,并且其中一个是旧的未简化问题的副本。