Как изменить текст TextInput после нажатия кнопки - PullRequest
2 голосов
/ 15 марта 2019

Что я должен сделать, чтобы увидеть 123 текст после нажатия Button 'Show 123'?

Это работает, когда я раскомментирую Clock.schedule_interval, но мне нужно, чтобы этот текст был редактируемым.Я вижу оба отпечатка "trigger" и "show", но текст '123' не отображается на входе.

Мне нужно, чтобы он работал с двумя классами.

from kivy.config import Config
Config.set('graphics', 'multisamples', '0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout

kv = '''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
    transition: FadeTransition()
    Show:

<First>:               
    Button:
        text: "Show 123"
        on_press: root.trigger_show()
<Second>:
    TextInput:
        id: textinput                
<Show>
    BoxLayout:
         First:
        Second:
'''

class ScreenManagement(ScreenManager):
    pass

class Show(Screen):
    pass

class First(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def trigger_show(self):
        print("trigger")
        s = Second()
        s.show()

class Second(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        #Clock.schedule_interval(self.show, 1)

    def show(self): #(self, dt):
        print('show')
        self.ids.textinput.text = '123'

sm = Builder.load_string(kv)

class TestApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()

1 Ответ

3 голосов
/ 15 марта 2019

Second, созданный в trigger_show, отличается от созданного в .kv, то есть он устанавливает текст в виджете, который не отображается и является временным, поскольку он является локальной переменной.

При создании классов вы должны выставлять сигналы или события внутренних элементов по всему классу.В этом случае я выставлю событие on_press кнопки на первое, а текстовое свойство TextInput на второе, затем создадим соединение в области видимости, где существуют оба элемента:

from kivy.config import Config
Config.set('graphics', 'multisamples', '0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout

kv = '''
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
    transition: FadeTransition()
    Show:

<First>:               
    Button:
        text: "Show 123"
        on_press: root.dispatch('on_press')
<Second>:
    text: ""
    TextInput:
        id: textinput  
        text: root.text              
<Show>
    BoxLayout:
        First:
            on_press:
                second.text = "123"
        Second:
            id: second
'''

class ScreenManagement(ScreenManager):
    pass

class Show(Screen):
    pass

class First(BoxLayout):
    def __init__(self, **kwargs):
        self.register_event_type('on_press')
        super().__init__(**kwargs)

    def on_press(self):
        pass

class Second(BoxLayout):
    pass

sm = Builder.load_string(kv)

class TestApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    TestApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...