Kivy - 另一个屏幕上的滑块类值更改 [英] Kivy - Slider Class value change on another screen

查看:15
本文介绍了Kivy - 另一个屏幕上的滑块类值更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a slider which value changes the label. That was easy to understand. Now the problem is I want to use this value to show on another screen. Eventually I want the slider to show 1-16 images on another screen dependent on what value is selected on the slider. Below is what I have as of now, which works well for that screen, but how do I get this value to show on another screen? I know I have to create a class, which have made multiple attempts and each seems to confuse me more than understand it better.

<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

推荐答案

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

You can pass values through underlying ScreenManager. A working example:

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

更新:

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

Update:

An extended exaple (adding buttons based on slider value):

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

这篇关于Kivy - 另一个屏幕上的滑块类值更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆