Python Kivy:如何访问循环中的按钮状态并在Python中更改转换

2024-10-06 09:07:54 发布

您现在位置: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”对象没有属性“manager”。这是有道理的,因为根是相对的

<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中动态地实现这一点

请参考下面的代码。请注意,我删除了下面代码中的转换,以便它可以运行

<;main.py>

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

<;主电压kv>

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

#Background layout for every screen
<BackgroundLayout>:
    Button:
        size_hint: None, None
        text: "Home button"
        size: root.width/4, 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, None
            size: root.width/4, 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"

Tags: selfnoneididssizemainmanagerbutton
1条回答
网友
1楼 · 发布于 2024-10-06 09:07:54

1.问题1
如何访问for循环中的按钮状态。我想检查按下了哪个按钮,然后在此基础上选择要显示的屏幕。我知道我可以通过ids.state访问状态,但是我不知道如何在循环中执行此操作
是否可以检查每个按钮的状态,然后返回按下哪个按钮的id?或者访问按下按钮的id?然后,我可以将其与屏幕ID进行比较

  • 回答:
    您正在使按钮的行为类似于切换按钮,但它们是按钮。
    所以,除非您不想专门使用ToggleButton类,否则使用内置函数isinstance(object,class)进行循环
    根据您的kv文件,这些按钮是MainScreen根小部件中BackgroundLayout的子项。因此,此函数将在背景布局中查找BTN,并返回按下按钮的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

只有当总有一个按钮处于关闭状态时,这才有效,这也是切换按钮背后的原因。如果您仍然坚持使用按钮,请将:
return child_2.id替换为一个列表变量,该变量将收集所有处于“关闭”状态的按钮的id。

但是,我重复一遍,除非您不喜欢ToggleButton类,否则我建议您使用它。因为您可以通过直接设置ScreenManager.current属性来更改屏幕,该属性与按钮块内的转换(以kv为单位)一起设置为所需的屏幕,如下所示

Button:
    size_hint: None, None
    text: "Home button"
    size: root.width/4, root.height/4
    on_release:
        root.manager.current = 'main_screen'
    

相关问题 更多 >