按下 kivy 按钮可转到多个屏幕之一
kivy button press to go to one of multiple screens
假设我有一个 kivy 程序,其中第一个屏幕有三个按钮,每个按钮都可以将您带到不同的屏幕。这些屏幕中的每一个都包含一个按钮,可将您带到最终屏幕(同一屏幕)。最终屏幕有一个 "back" 按钮。如何使最终屏幕上的 "back" 按钮带您返回上一个屏幕(上述 3 个中的第 1 个)?下面是一个粗略的图表,可以更好地帮助形象化我的问题。
Screen 1
Start Screen --> Screen 2 --> Final Screen
Screen 3
截至目前,最终屏幕上的 "back" 按钮会将您带回“开始”屏幕,但这不是我想要的。
我的python代码:
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
class MyScreenManager(ScreenManager):
pass
# Branch Screen, takes you to S1, S2, or S3
class BRANCH(Screen):
pass
class S1(Screen):
pass
class S2(Screen):
pass
class S3(Screen):
pass
class FINAL_SCREEN(Screen):
pass
class MAINApp(App):
def build(self):
return MyScreenManager()
if __name__ == '__main__':
MAINApp().run()
我的基维语代码:
#:kivy 1.0.9
<MyScreenManager>:
BRANCH:
name: 'branch'
S1:
name: 'screen1'
S2:
name: 'screen2'
S3:
name: 'screen3'
FINAL_SCREEN:
name: 'final_screen'
<BRANCH>
FloatLayout:
Button:
text: 'Screen-1'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.75}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen1'
Button:
text: 'Screen-2'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.40}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen2'
Button:
text: 'Screen-3'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.05}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen3'
<S1>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'this is SCREEN-1'
color: 1, 1, 1, 1
Button:
text: 'Forward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<S2>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'me este SCREEN-2'
color: 1, 1, 1, 1
Button:
text: 'Onward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<S3>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'something SCREEN-3'
color: 1, 1, 1, 1
Button:
text: 'Lets Go'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<FINAL_SCREEN>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = 'branch'
非常感谢任何帮助或建议。
这是在 Final
屏幕上使用 StringProperty 的一种解决方案。
进入最终画面时设置
root.manager.ids.final.previous = root.name
返回时我正在使用它转到此屏幕
root.manager.current = root.previous
这是您的整个应用程序
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from kivy.properties import StringProperty
kv_str = """
MyScreenManager:
BRANCH:
name: 'branch'
S1:
name: 'screen1'
S2:
name: 'screen2'
S3:
name: 'screen3'
FINAL_SCREEN:
id: final
name: 'final_screen'
<BRANCH>
FloatLayout:
Button:
text: 'Screen-1'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.75}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen1'
Button:
text: 'Screen-2'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.40}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen2'
Button:
text: 'Screen-3'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.05}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen3'
<S1>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'this is SCREEN-1'
color: 1, 1, 1, 1
Button:
text: 'Forward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<S2>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'me este SCREEN-2'
color: 1, 1, 1, 1
Button:
text: 'Onward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<S3>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'something SCREEN-3'
color: 1, 1, 1, 1
Button:
text: 'Lets Go'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<FINAL_SCREEN>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = root.previous
"""
class MyScreenManager(ScreenManager):
pass
# Branch Screen, takes you to S1, S2, or S3
class BRANCH(Screen):
pass
class S1(Screen):
pass
class S2(Screen):
pass
class S3(Screen):
pass
class FINAL_SCREEN(Screen):
previous = StringProperty()
class MAINApp(App):
def build(self):
return Builder.load_string(kv_str)
if __name__ == '__main__':
MAINApp().run()
我按照评论
中的建议尝试了 previous()
<FINAL_SCREEN>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
print(root.manager.previous())
root.manager.current = root.manager.previous()
奇怪的是,它总是return screen3,因此我使用了上面的版本。
假设我有一个 kivy 程序,其中第一个屏幕有三个按钮,每个按钮都可以将您带到不同的屏幕。这些屏幕中的每一个都包含一个按钮,可将您带到最终屏幕(同一屏幕)。最终屏幕有一个 "back" 按钮。如何使最终屏幕上的 "back" 按钮带您返回上一个屏幕(上述 3 个中的第 1 个)?下面是一个粗略的图表,可以更好地帮助形象化我的问题。
Screen 1
Start Screen --> Screen 2 --> Final Screen
Screen 3
截至目前,最终屏幕上的 "back" 按钮会将您带回“开始”屏幕,但这不是我想要的。
我的python代码:
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
class MyScreenManager(ScreenManager):
pass
# Branch Screen, takes you to S1, S2, or S3
class BRANCH(Screen):
pass
class S1(Screen):
pass
class S2(Screen):
pass
class S3(Screen):
pass
class FINAL_SCREEN(Screen):
pass
class MAINApp(App):
def build(self):
return MyScreenManager()
if __name__ == '__main__':
MAINApp().run()
我的基维语代码:
#:kivy 1.0.9
<MyScreenManager>:
BRANCH:
name: 'branch'
S1:
name: 'screen1'
S2:
name: 'screen2'
S3:
name: 'screen3'
FINAL_SCREEN:
name: 'final_screen'
<BRANCH>
FloatLayout:
Button:
text: 'Screen-1'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.75}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen1'
Button:
text: 'Screen-2'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.40}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen2'
Button:
text: 'Screen-3'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.05}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen3'
<S1>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'this is SCREEN-1'
color: 1, 1, 1, 1
Button:
text: 'Forward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<S2>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'me este SCREEN-2'
color: 1, 1, 1, 1
Button:
text: 'Onward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<S3>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'something SCREEN-3'
color: 1, 1, 1, 1
Button:
text: 'Lets Go'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
<FINAL_SCREEN>
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = 'branch'
非常感谢任何帮助或建议。
这是在 Final
屏幕上使用 StringProperty 的一种解决方案。
进入最终画面时设置
root.manager.ids.final.previous = root.name
返回时我正在使用它转到此屏幕
root.manager.current = root.previous
这是您的整个应用程序
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from kivy.properties import StringProperty
kv_str = """
MyScreenManager:
BRANCH:
name: 'branch'
S1:
name: 'screen1'
S2:
name: 'screen2'
S3:
name: 'screen3'
FINAL_SCREEN:
id: final
name: 'final_screen'
<BRANCH>
FloatLayout:
Button:
text: 'Screen-1'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.75}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen1'
Button:
text: 'Screen-2'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.40}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen2'
Button:
text: 'Screen-3'
color: 1.0, 0.6, 0.0, 1
font_size: 30
size_hint_x: 0.50
size_hint_y: 0.25
pos_hint: {'x': 0.20, 'y': 0.05}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'screen3'
<S1>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'this is SCREEN-1'
color: 1, 1, 1, 1
Button:
text: 'Forward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<S2>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'me este SCREEN-2'
color: 1, 1, 1, 1
Button:
text: 'Onward'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<S3>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'something SCREEN-3'
color: 1, 1, 1, 1
Button:
text: 'Lets Go'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'left'
root.manager.current = 'final_screen'
root.manager.ids.final.previous = root.name
<FINAL_SCREEN>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
root.manager.transition.direction = 'right'
root.manager.current = root.previous
"""
class MyScreenManager(ScreenManager):
pass
# Branch Screen, takes you to S1, S2, or S3
class BRANCH(Screen):
pass
class S1(Screen):
pass
class S2(Screen):
pass
class S3(Screen):
pass
class FINAL_SCREEN(Screen):
previous = StringProperty()
class MAINApp(App):
def build(self):
return Builder.load_string(kv_str)
if __name__ == '__main__':
MAINApp().run()
我按照评论
中的建议尝试了previous()
<FINAL_SCREEN>:
FloatLayout:
Label:
pos_hint: {'x': 0.00, 'y': 0.20}
font_size: 35
text: 'Final Screen'
color: 1, 1, 1, 1
Button:
text: 'Back'
color: 1.0, 0.6, 0.0, 1
font_size: 20
size_hint_x: 0.20
size_hint_y: 0.20
pos_hint: {'x': 0.40, 'y': 0.15}
on_release:
print(root.manager.previous())
root.manager.current = root.manager.previous()
奇怪的是,它总是return screen3,因此我使用了上面的版本。