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

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

问题描述

我有一个滑块,其值更改标签。这很容易理解。现在的问题是我想使用这个值显示在另一个屏幕上。最后,我想让滑块在另一个屏幕上显示1-16图像,这取决于滑块上选择的值。下面是我现在的,它适用于那个屏幕,但如何让这个值显示在另一个屏幕上?我知道我必须创建一个类,这已经做了多次尝试,每个似乎混淆我更多的了解它更好。

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

标签:
text:'New Game'
font_size:70
标签:
text:玩家
font_size:30
pos:300,400

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

标签:
text:'{}'。格式(s1.value)
font_size:30
pos:670,400
pre>

解决方案

您可以通过底层 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'

滑块:
id:s1
最小值:1
最大值:16
步长:1
value:1
on_value:
root.manager.get_screen('options')。label.text = str(self.value)
Button:
text:选项'
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'

标签:
id:label
text:'1'

'''
Builder.load_string(kv)

class NewGameScreen(Screen):
pass

class OptionScreen(Screen):
pass

class TestApp(App):
def build(self):
sm = ScreenManager $ b sm.add_widget(NewGameScreen())
sm.add_widget(OptionScreen())
return sm

如果__name__ =='__main__':
TestApp ).run()



更新:



>扩展exaple(根据滑块值添加按钮):



从kivy.app导入应用程序中导入

  
从kivy.lang import Builder
从kivy.uix.button导入按钮
从kivy.uix.screenmanager导入ScreenManager,屏幕
从kivy.properties import ObjectProperty

kv ='''
#:import Label kivy.uix.label.Label
< NewGameScreen> ;:
name:'newgame'
slider:slider
BoxLayout:
orientation:'vertical'

滑块:
id:slider
最小值:1
最大值:16
:1
value:1
on_value:root.update_buttons()

按钮:
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
b $ b'''
Builder.load_string(kv)

class NewGameScreen(Screen):
slider = ObjectProperty(None)
def update_buttons args):
layout = self.manager.get_screen('options')。layout
layout.clear_widgets()
for i in range(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

如果__name__ =='__main__':
TestApp()。run()
/ pre>

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

解决方案

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(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天全站免登陆