2016-04-26 59 views
1

我是基维新人。我想创建一个应用程序,它接受用户文本输入,然后显示它。但是当用户输入很长时,我希望显示区域可以滚动。如何在Kivy中添加滚动文本小部件?

我已经做了一些教程,可以单独做两件事情,但我有麻烦把它们放在一起。

下面是代码,允许滚动文本:

__version__ = '1.0.1' 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.scrollview import ScrollView 
import warnings 
import string 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import StringProperty 

Builder.load_string(''' 
<ScrolllabelLabel>: 
    Label: 
     text: root.text 
     font_size: 50 
     text_size: self.width, None 
     size_hint_y: None 
     height: self.texture_size[1] 
''') 

class ScrolllabelLabel(ScrollView): 
    text = StringProperty('srgsdrgsdfh dsfg dvgf vgsdfv srfvsdfsdrfv sevrv sdrfv serv serv serv servsrd vsv srvsdrfvvv' * 10) 

runTouchApp(ScrolllabelLabel()) 

这里是显示你键入的代码:

__version__ = '1.0.1' 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.scrollview import ScrollView 
import warnings 
import string 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import StringProperty 

class SomeApp(App): 
    def build(self): 
     grid = GridLayout(cols=1, size_hint_x=None, width="600dp") 

     self.lbl0 = Label(text='Tap and type a word/phrase below') # create a label instance 
     grid.add_widget(self.lbl0) # physically add the label onto the layout 

     self.txt1 = TextInput(text='', multiline=False) # create a text input instance 
     grid.add_widget(self.txt1) # physically add the text input onto the layout 

     self.lbl1 = Label(text='Display') # create a label instance 
     grid.add_widget(self.lbl1) # physically add the label onto the layout 

     btn1 = Button(text='Press') # create a button instance 
     btn1.bind(on_press=self.mirror) # binding the button with the function below 
     grid.add_widget(btn1) 

     return grid 

    def mirror(self, userInput): 
     self.lbl1.text = self.txt1.text 

SomeApp().run() 

但我不能将它们合并:

__version__ = '1.0.1' 

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.scrollview import ScrollView 
import warnings 
import string 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import StringProperty 

Builder.load_string(''' 
<ScrolllabelLabel>: 
    Label: 
     text: root.text 
     font_size: 50 
     text_size: self.width, None 
     size_hint_y: None 
     height: self.texture_size[1] 
''') 

class ScrolllabelLabel(ScrollView): 
    def __init__(self, **kwargs): 
     self.txt0 = StringProperty() 

class SomeApp(App): 
    def build(self): 
     grid = GridLayout(cols=1, size_hint_x=None, width="600dp") 

     self.lbl0 = Label(text='Tap and type a word/phrase below') # create a label instance 
     grid.add_widget(self.lbl0) # physically add the label onto the layout 

     self.txt1 = TextInput(text='', multiline=False) # create a text input instance 
     grid.add_widget(self.txt1) # physically add the text input onto the layout 

     btn1 = Button(text='Press') # create a button instance 
     btn1.bind(on_press=self.displayFunc) # binding the button with the function below 
     grid.add_widget(btn1) 

     # Add scrolling text 
     """self.lbl1 = Label(text='Display') # create a label instance 
     grid.add_widget(self.lbl1) # physically add the label onto the layout""" 
     scrollWidget = ScrolllabelLabel(text=self.lbl1.text) 
     grid.add_widget(scrollWidget) 

     return grid 

    def displayFunc(self, userInput): 
     self.lbl1.text = self.txt1 

SomeApp().run() 
我得到了这个错误:
+0

'self.lbl1.text = self.txt1'编辑scrollwidget,这是你的属性的错误并使用self.txt1._text_,因为你想要的文字,而不是针对小部件本身。 – KeyWeeUsr

+0

如何执行“self.lbl1.text = self.txt1编辑到scrollwidget”的建议? – KubiK888

回答

1

你所做的是multiline=False因此,该应用程序会表现出这种方式,无论你制作的多么大TextInput,它仍然是一条线。使用multiline=True作为默认的TextInput,它会正确地包装输入。

然后我看到你已经有一个可滚动标签的主体,所以只需使用默认的主体,使用该默认类,并将变量ScrolllabelLabel与第一个文件一起输出。

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.uix.widget import Widget 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.scrollview import ScrollView 
import warnings 
import string 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import StringProperty 

Builder.load_string(''' 
<ScrolllabelLabel>: 
    Label: 
     text: root.text 
     font_size: 50 
     text_size: self.width, None 
     size_hint_y: None 
     height: self.texture_size[1] 
''') 

class ScrolllabelLabel(ScrollView): 
    text = StringProperty('') 
class SomeApp(App): 
    def build(self): 
     grid = GridLayout(cols=1, size_hint_x=None, width="600dp") 

     self.lbl0 = Label(text='Tap and type a word/phrase below') # create a label instance 
     grid.add_widget(self.lbl0) # physically add the label onto the layout 

     self.txt1 = TextInput(text='', multiline=True) # create a text input instance 
     grid.add_widget(self.txt1) # physically add the text input onto the layout 

     self.lbl1 = ScrolllabelLabel(text='Display') # create a label instance 
     grid.add_widget(self.lbl1) # physically add the label onto the layout 

     btn1 = Button(text='Press') # create a button instance 
     btn1.bind(on_press=self.mirror) # binding the button with the function below 
     grid.add_widget(btn1) 

     return grid 

    def mirror(self, userInput): 
     self.lbl1.text = self.txt1.text 

SomeApp().run() 
+0

您的代码有效。将研究它更接近。谢谢。 – KubiK888

+1

我只使用了多行,并添加了所需的输出管理器(?)。使用[Crash course](http://inclem.net/pages/kivy-crash-course/)快速学习kivy :) – KeyWeeUsr

+0

我不知道你用什么通用指南来放置“自我”。在一个函数内的变量前面?我发现它适用于和不适用于某些情况。例如,你为什么使用self.lbl1而不是self.btn1? – KubiK888