如何使用python和kivy在函数外取值?

问题描述 投票:0回答:1

这是一个简单的python kivy应用,只有文本标签和滑块。这段代码很好用。

from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.floatlayout import FloatLayout
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
from kivymd.uix.slider import Slider
from kivy.properties  import NumericProperty
from kivymd.uix.label import MDLabel

class Screen1(Screen):
    def __init__(self, **kwargs):
        super(Screen1, self).__init__(**kwargs)
        layout = FloatLayout()

        self.hours_value = MDLabel(text = "0", halign = "center", pos_hint = {'center_x':.5, 'center_y':.80}, theme_text_color = 'Error')
        self.hours_slider = Slider(min = 0, max = 24, pos_hint = {'center_x':.5}, size_hint_x = .7)
        self.hours_slider.bind(value = self.on_value_hours)

        layout.add_widget(self.hours_value)
        layout.add_widget(self.hours_slider)
        self.add_widget(layout)

    def on_value_hours(self, instance, slider):
        self.hours_value.text = "%d"%slider
        print(instance)
        print("%d"%slider)
        return slider

class myapp(MDApp):
    def build(self):
        self.theme_cls = ThemeManager()
        self.theme_cls.primary_palette = 'Orange'
        self.theme_cls.accent_pallete = 'Blue'
        self.theme_cls.theme_style = 'Dark'

        sm = ScreenManager()
        sm.add_widget(Screen1(name = 's1'))
        return sm

if __name__ == "__main__":
    myapp().run()

但是现在我想在我的函数之外获取滑块的值。def on_value_hours(self, instance, slider):

所以我加了这段代码 my_value_slider = on_value_hours()

但我得到一个错误 on_value_hours() 缺少3个必要的位置参数。'self', 'instance', 和 'slider'。

我试着添加 my_value_slider = on_value_hours(1,1,1)

但这对我来说也是行不通的 :(

给我一个错误 属性错误:'int'对象没有属性'hours_value'。

这是一个完整的代码,但仍然给我一个错误。我想在我的函数中获取外部的值。请帮助我。

from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.floatlayout import FloatLayout
from kivymd.app import MDApp
from kivymd.theming import ThemeManager
from kivymd.uix.slider import Slider
from kivy.properties  import NumericProperty
from kivymd.uix.label import MDLabel

class Screen1(Screen):
    def __init__(self, **kwargs):
        super(Screen1, self).__init__(**kwargs)
        layout = FloatLayout()

        self.hours_value = MDLabel(text = "0", halign = "center", pos_hint = {'center_x':.5, 'center_y':.80}, theme_text_color = 'Error')
        self.hours_slider = Slider(min = 0, max = 24, pos_hint = {'center_x':.5}, size_hint_x = .7)
        self.hours_slider.bind(value = self.on_value_hours)

        layout.add_widget(self.hours_value)
        layout.add_widget(self.hours_slider)
        self.add_widget(layout)

    def on_value_hours(self, instance, slider):
        self.hours_value.text = "%d"%slider
        print(instance)
        print("%d"%slider)
        return slider

    my_value_slider = on_value_hours(1,1,1)

class myapp(MDApp):
    def build(self):
        self.theme_cls = ThemeManager()
        self.theme_cls.primary_palette = 'Orange'
        self.theme_cls.accent_pallete = 'Blue'
        self.theme_cls.theme_style = 'Dark'

        sm = ScreenManager()
        sm.add_widget(Screen1(name = 's1'))
        return sm

if __name__ == "__main__":
    myapp().run()
python python-3.x class kivy kivy-language
1个回答
0
投票

另一种方法更像你最初的代码,其中包括 my_slider_value 将是一个类变量(而不是实例变量)。

class Screen1(Screen):
    # class variable
    my_value_slider = 0

    def __init__(self, **kwargs):
        super(Screen1, self).__init__(**kwargs)
        layout = FloatLayout()

        self.hours_value = MDLabel(text = "0", halign = "center", pos_hint = {'center_x':.5, 'center_y':.80}, theme_text_color = 'Error')
        self.hours_slider = Slider(min = 0, max = 24, pos_hint = {'center_x':.5}, size_hint_x = .7)
        self.hours_slider.bind(value = self.on_value_hours)

        layout.add_widget(self.hours_value)
        layout.add_widget(self.hours_slider)
        self.add_widget(layout)

    def on_value_hours(self, instance, slider):
        self.hours_value.text = "%d"%slider
        print(instance)
        print("%d"%slider)

        # update value of class variable
        Screen1.my_value_slider = slider

        return slider

然后你可以访问 my_value_slider 作为 Screen1.my_value_slider. 请注意,该访问中没有使用parens。这种方法的缺点是 my_value_slider 不是 Property所以你不能绑定到它。


0
投票

你可以做这样的事情。

class Screen1(Screen):
    # slider value
    my_value_slider = NumericProperty(0)

    def __init__(self, **kwargs):
        super(Screen1, self).__init__(**kwargs)
        layout = FloatLayout()

        self.hours_value = MDLabel(text = "0", halign = "center", pos_hint = {'center_x':.5, 'center_y':.80}, theme_text_color = 'Error')
        self.hours_slider = Slider(min = 0, max = 24, pos_hint = {'center_x':.5}, size_hint_x = .7)
        self.hours_slider.bind(value = self.on_value_hours)

        layout.add_widget(self.hours_value)
        layout.add_widget(self.hours_slider)
        self.add_widget(layout)

    def on_value_hours(self, instance, slider):
        self.hours_value.text = "%d"%slider
        print(instance)
        print("%d"%slider)

        # save value
        self.my_value_slider = slider
        return slider
© www.soinside.com 2019 - 2024. All rights reserved.