如何解决Python Kivy:如何在循环中访问按钮状态并在 python 中更改转换
如何在 for 循环中访问按钮状态。我想检查按下了哪个按钮,然后根据这个选择我想要显示的屏幕。我知道我可以通过 ids.state 访问状态,但是我不知道如何在循环中执行此操作。以下代码是我目前正在访问的访问方式。
if self.root.ids.main_screen.ids.second_screen_button.state == "down":
self.sm.current = "second_screen"
是否可以检查每个按钮的状态,然后返回按下的任何按钮的 id?或者访问按下按钮的ID?然后我可以将其与屏幕 ID 进行比较。
此外,当按钮不在屏幕根时如何更改过渡。下面的代码不起作用。它给出了以下错误 AttributeError: 'BackgroundLayout' object has no attribute 'manager'。这是有道理的,因为根是一个 RelativeLayout。
<BackgroundLayout>:
Button:
size_hint: None,None
text: "Home button"
size: root.width/4,root.height/4
on_release:
root.manager.transition = SlideTransition(direction="right",duration=0.25)
app.home_screen()
在这种情况下是否应该在python中更改转换?我一直没能找到如何在 python 中动态地做到这一点。
请参阅以下代码以供参考。请注意,我从下面的代码中删除了转换,以便它可以运行
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager,Screen,SlideTransition
from kivy.uix.relativelayout import RelativeLayout
class MainScreen(Screen):
def change_screen(self):
self.manager.current = "steak_screen"
class SecondScreen(Screen):
pass
class ThirdScreen(Screen):
pass
class Manager(ScreenManager):
pass
class BackgroundLayout(RelativeLayout):
pass
class MainApp(App):
def build(self):
self.sm = Manager()
return self.sm
# Change screen based on button pressed
def change_screen(self):
if self.root.ids.main_screen.ids.second_screen_button.state == "down":
self.sm.current = "second_screen"
if self.root.ids.main_screen.ids.third_screen_button.state == "down":
self.sm.current = "third_screen"
# Return to main screen when pressed
def home_screen(self):
self.sm.current = "main_screen"
MainApp().run()
#:import SlideTransition kivy.uix.screenmanager.SlideTransition
#Background layout for every screen
<BackgroundLayout>:
Button:
size_hint: None,root.height/4
on_release:
app.home_screen()
# Main Screen
<MainScreen>
BackgroundLayout:
Label:
text: "Home"
Button:
id: second_screen_button
size_hint: None,None
size: root.width/4,root.height/4
pos: root.x + root.width/4,0
text: "second screen button"
on_press:
self.state = "down"
app.change_screen()
self.state = "normal"
Button:
id: third_screen_button
size_hint: None,root.height/4
pos: root.x + root.width/2,0
text: "third screen button"
on_press:
self.state = "down"
app.change_screen()
self.state = "normal"
<SecondScreen>
BackgroundLayout:
<ThirdScreen>
BackgroundLayout:
# Screen manager
<Manager>:
id: _manager
MainScreen:
id: main_screen
manager: _manager
name: "main_screen"
SecondScreen:
id: second_screen
manager: _manager
name: "second_screen"
ThirdScreen:
id: third_screen
manager: _manager
name: "third_screen"
解决方法
1.问题1
我将如何在 for 循环中访问按钮状态。我想检查按下了哪个按钮,然后根据这个选择我想要显示的屏幕。我知道我可以通过 ids.state 访问状态,但是我不知道如何在循环中执行此操作。
是否可以检查每个按钮的状态,然后返回按下的任何按钮的 id?或者访问按下按钮的ID?然后我可以将其与屏幕 ID 进行比较。
- 答案:
您正在使按钮的行为类似于 ToggleButton,但它们是按钮。
因此,除非您完全不想使用 ToggleButton 类,否则请使用内置函数 isinstance(object,Class) ;
根据您的 kv 文件,按钮是 MainScreen 根窗口小部件中 BackgroundLayout 的子项。所以这个函数会在BackgroundLayout中寻找btns,并返回按下按钮的id。
def get_id_of_pressed_btn(self):
for child_1 in self.children:
# in this case child_1 = BackgroundLayout
for child_2 in child_1:
# checks if child_2 is a Button object
if isinstance(child_2,Button):
if child_2.state = 'down':
return child_2.id
这只有在总有一个 Button 处于按下状态时才有效,这也是 ToggleButtons 背后的原因。如果您仍然坚持使用按钮,请将:
return child_2.id 替换为一个列表变量,该变量应收集所有处于“按下”状态的按钮的 ID。
但是,我再说一遍,除非您不喜欢 ToggleButton 类,否则我建议您使用它。因为您可以通过直接将 ScreenManager.current 属性设置为您想要的屏幕以及在 kv 中的 Button 块中的过渡来更改屏幕,就像这样;
Button:
size_hint: None,None
text: "Home button"
size: root.width/4,root.height/4
on_release:
root.manager.current = 'main_screen'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。