如何在 Kivy 中添加滚动文本小部件?

Kub*_*888 5 android scroll scrollview python-2.7 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())
Run Code Online (Sandbox Code Playgroud)

这是显示您键入的内容的代码:

__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()
Run Code Online (Sandbox Code Playgroud)

但我不能将它们结合起来:

__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()
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

 AttributeError: 'SomeApp' object has no attribute 'lbl1'
Run Code Online (Sandbox Code Playgroud)

Key*_*Usr 5

multiline=False因此,您所做的是应用程序会以这种方式运行,无论您制作多大TextInput,它仍然是一行。使用multiline=True您的默认TextInput和它会妥善包装输入。

然后我看到你已经有一个可滚动标签的主体,所以只需使用默认的,使用该默认类并在你的第一个文件中输入你的输出text变量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()
Run Code Online (Sandbox Code Playgroud)