Как изменить текст, вводимый после нажатия кнопки

#python #kivy

#python #kivy

Вопрос:

Что я должен сделать, чтобы увидеть 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:

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

При создании классов вы должны предоставлять сигналы или события внутренних элементов по всему классу. В этом случае я предоставлю событие on_press кнопки первому, а свойство text 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()