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