2016-04-26 5 views
1

Ich bin neu in Kivy. Ich möchte eine App erstellen, die Benutzertexteingabe nimmt, und sie dann anzeigen. Aber wenn die Benutzereingabe sehr lang ist, möchte ich, dass der Anzeigebereich scrollbar ist.Wie Sie Scroll-Widget in Kivy hinzufügen?

Ich habe einige Tutorials gemacht und kann beide Dinge getrennt machen, aber ich habe Probleme, sie zusammen zu setzen.

Hier ist der Code scrollbaren Text zu ermöglichen:

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

Und hier ist der Code angezeigt werden, was Sie eingeben:

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

Aber ich kann sie nicht kombinieren:

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

Ich habe diesen Fehler:

AttributeError: 'SomeApp' object has no attribute 'lbl1' 
+0

'self.lbl1.text = self.txt1' bearbeiten scrollwidget, das ist dein Attribut Fehler und verwenden self.txt1._text_, weil Sie Texteigenschaft wollen, nicht das Widget selbst. – KeyWeeUsr

+0

Wie führe ich Ihren Vorschlag von "self.lbl1.text = self.txt1 edit to scrollwidget" durch? – KubiK888

Antwort

1

Was Sie getan haben ist multiline=False daher die App wird sich so verhalten und spielt keine Rolle, wie groß Sie TextInput machen, wird es immer noch eine Zeile sein. Verwenden Sie multiline=True für Ihre Standard-Texteingabe und es wird die Eingabe ordnungsgemäß umbrochen.

Dann sehe ich Sie bereits einen Körper für scrollbare Label, so verwenden Sie einfach die Standard-Klasse, verwenden Sie diese Standardklasse und füttern die text Variable von ScrolllabelLabel in Ihrer ersten Datei mit Ihrer Ausgabe.

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

Ihr Code funktioniert. Ich werde es näher untersuchen. Vielen Dank. – KubiK888

+1

Ich habe nur Multiline richtig verwendet und den gewünschten Output Manager (?) Hinzugefügt. Benutze [Crash-Kurs] (http://inclem.net/pages/kivy-crash-course/), um kivy schnell zu lernen :) – KeyWeeUsr

+0

Ich frage mich, welche allgemeine Richtlinie du verwendest, um das "Selbst" zu setzen. vor einer Variablen innerhalb einer Funktion? Ich fand es mit und ohne für ein Szenario funktioniert. Warum haben Sie beispielsweise self.lbl1, aber nicht self.btn1 verwendet? – KubiK888