Python киви два GridLayouts и Screen Menager
У меня есть два приложения в киви. Оба были основаны на GridLayout. Я нашел похожую проблему, но я не понимаю: связывание экранов с классами GridLayout в kivy.
В .py:
import kivy
kivy.require("1.9.0")
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
class FirstScreen(GridLayout):
#some methods
class SecondScreen(GridLayout):
#some methods
В .кв
<FirstScreen>:
id: sterowanie_serv
display: entry
rows: 10
padding: 10
spacing: 10
BoxLayout:
spacing: 20
CustButton:
text:'1'
on_press: do method from second screen class
CustButton:
text:'x'
on_press: do method from second screen class
CustButton:
text:'go to Second screen'
on_press: root.manager.current = 'SecondScreen'
<SecondScreen>:
id: Przemo
display: entry
rows: 5
padding: 10
spacing: 10
BoxLayout:
spacing: 20
CustButton:
text:'1'
on_press: do method from second screen class
CustButton:
text:'x2'
on_press: do method from second screen class
CustButton:
text:'go to First screen'
on_press: root.manager.current = 'SecondScreen'
Как использовать диспетчер экрана для первого отображения первого экрана и нажатия на кнопку " Второй экран"?
В итоге будет:
on_press:
root.manager.current = 'SecondScreen'
1 ответ
Решение
ScreenManager
принимает только Screen
виджеты. FirstScreen
а также SecondScreen
должен быть Screen
случаи, они не могут быть GridLayouts
, внутри FirstScreen
а также SecondScreen
где вы должны создать GridLayouts.
С другой стороны, ScreenManager.current
Атрибут - это имя отображаемого в данный момент экрана. Вам нужно установить атрибут имени в ваших окнах.
Пример на основе вашего кода:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
kv_text = """\
#:import WipeTransition kivy.uix.screenmanager.WipeTransition
<MainScreen>:
transition: WipeTransition()
id: sm
FirstScreen:
SecondScreen:
<FirstScreen>:
name: "first_screen"
GridLayout:
id: sterowanie_serv
rows: 10
padding: 10
spacing: 10
BoxLayout:
spacing: 20
Button:
text:'1'
on_press: print(app.root)
Button:
text:'x'
on_press: print('Button X')
Button:
text:'go to Second screen'
on_press: app.root.current = 'second_screen'
<SecondScreen>:
name: "second_screen"
GridLayout:
id: Przemo
rows: 5
padding: 10
spacing: 10
BoxLayout:
spacing: 20
Button:
text:'1'
on_press: print('Button 1')
Button:
text:'x2'
on_press: print('Button X2')
Button:
text:'go to First screen'
on_press: app.root.current = 'first_screen'
"""
class MainScreen(ScreenManager):
def __init__(self):
super(MainScreen, self).__init__()
class FirstScreen(Screen):
#some methods
pass
class SecondScreen(Screen):
#some methods
pass
class MyKivyApp(App):
def build(self):
return MainScreen()
def main():
Builder.load_string(kv_text)
app = MyKivyApp()
app.run()
if __name__ == '__main__':
main()
Бегущий пример: