Kivy - 另一个屏幕上的滑块类值更改

Posted

技术标签:

【中文标题】Kivy - 另一个屏幕上的滑块类值更改【英文标题】:Kivy - Slider Class value change on another screen 【发布时间】: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

【问题讨论】:

【参考方案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,我添加了另一个示例。我希望这会有所帮助。

以上是关于Kivy - 另一个屏幕上的滑块类值更改的主要内容,如果未能解决你的问题,请参考以下文章

光滑的滑块同步 - 断点上的自定义箭头

Kivy:继承另一个动态类值

更改 MPVolumeView 的滑块

移动视图图像上的滑块未显示

从 Kivy 的另一个屏幕更改小部件

为什么Unity中的滑块变为非交互式