【问题标题】:Kivy - Slider Class value change on another screenKivy - 另一个屏幕上的滑块类值更改
【发布时间】:2015-06-07 18:31:04
【问题描述】:

我有一个滑块,它的值会改变标签。这很容易理解。现在的问题是我想用这个值在另一个屏幕上显示。最终,我希望滑块在另一个屏幕上显示 1-16 个图像,具体取决于滑块上选择的值。以下是我现在所拥有的,它适用于该屏幕,但我如何让这个值显示在另一个屏幕上?我知道我必须创建一个类,它已经进行了多次尝试,每一次似乎都让我感到困惑,而不是更好地理解它。

<NewGameScreen>:
    name: 'newgame'
    BoxLayout:
        orientation: 'vertical'
        height: 100       

        Label:
            text: 'New Game'
            font_size: 70
                Label:
                    text: 'Players'
                    font_size: 30
                    pos: 300, 400

                Slider:
                    id: s1
                    pos: 420, 400
                    width: '250dp'
                    min: 1
                    max: 16
                    step: 1
                    value: 1
                    on_value: s1.value = self.value

                Label:
                    text: '{}'.format(s1.value)
                    font_size: 30
                    pos: 670, 400

【问题讨论】:

    标签: class slider kivy bind


    【解决方案1】:

    您可以通过底层ScreenManager 传递值。一个工作示例:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    kv = '''
    <NewGameScreen>:
        name: 'newgame'
        BoxLayout:
            orientation: 'vertical'
    
            Slider:
                id: s1
                min: 1
                max: 16
                step: 1
                value: 1
                on_value: 
                    root.manager.get_screen('options').label.text = str(self.value)
            Button:
                text: 'Options'
                on_press: 
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'options'
    
    <OptionScreen>:
        label: label
        name: 'options'
        orientation: 'vertical'
        BoxLayout:
            Button:
                text: 'Go back'
                on_press: 
                    root.manager.transition.direction = 'right'
                    root.manager.current = 'newgame'
    
            Label:
                id: label
                text: '1'
    
    '''
    Builder.load_string(kv)
    
    class NewGameScreen(Screen):
        pass
    
    class OptionScreen(Screen):
        pass
    
    class TestApp(App):
        def build(self):
            sm = ScreenManager()
            sm.add_widget(NewGameScreen())
            sm.add_widget(OptionScreen())
            return sm
    
    if __name__ == '__main__':
        TestApp().run()
    

    更新:

    扩展示例(根据滑块值添加按钮):

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.button import Button
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.properties import ObjectProperty
    
    kv = '''
    #:import Label kivy.uix.label.Label
    <NewGameScreen>:
        name: 'newgame'
        slider: slider
        BoxLayout:
            orientation: 'vertical'
    
            Slider:
                id: slider
                min: 1
                max: 16
                step: 1
                value: 1
                on_value: root.update_buttons()
    
            Button:
                text: 'Options'
                on_press: 
                    root.manager.transition.direction = 'left'
                    root.manager.current = 'options'
    
    <OptionScreen>:
        layout: layout
        name: 'options'
        BoxLayout:
            Button:
                text: 'Go back'
                on_press: 
                    root.manager.transition.direction = 'right'
                    root.manager.current = 'newgame'
            BoxLayout:
                orientation: 'vertical'
                id:layout
                Button:
                    text: "1"
    
    '''
    Builder.load_string(kv)
    
    class NewGameScreen(Screen):
        slider = ObjectProperty(None)
        def update_buttons(self, *args):
            layout = self.manager.get_screen('options').layout
            layout.clear_widgets()
            for i in range(int(self.slider.value)):
                layout.add_widget(Button(text=str(i+1))) 
    
    
    class OptionScreen(Screen):
        layout = ObjectProperty(None)
    
    
    class TestApp(App):
        def build(self):
            sm = ScreenManager()
            sm.add_widget(NewGameScreen())
            sm.add_widget(OptionScreen())
            return sm
    
    if __name__ == '__main__':
        TestApp().run()
    

    【讨论】:

    • 好的,但是如果我希望滑块的值变成选项屏幕上的 1-16 个按钮呢?那我会把它作为一个值吗?
    • 但是感谢演示和解释,真的很有帮助
    • 恐怕我不太明白你的意思。你能解释一下吗?
    • 因此滑块创建的值(可能是 1-16)将创建选项屏幕上显示的按钮数量。这是为游戏创建多少玩家,并希望“选项屏幕”显示网格布局和按钮以稍后选择其他选项。希望有帮助。另一件事是来自 Slider 的值也会创建 db,但那是稍后我获得更多经验后
    • @tunedin,我添加了另一个示例。我希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多