Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python和kivy获得函数外的值_Python_Python 3.x_Class_Kivy_Kivy Language - Fatal编程技术网

如何使用python和kivy获得函数外的值

如何使用python和kivy获得函数外的值,python,python-3.x,class,kivy,kivy-language,Python,Python 3.x,Class,Kivy,Kivy Language,这是一个简单的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

这是一个简单的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)之外获取slider的值:

所以我添加了这个代码
my\u value\u slider=on\u value\u hours()

但是我在缺少3个必需的位置参数的情况下得到了一个错误:'self'、'instance'和'slider'

我尝试添加
my\u value\u slider=on\u value\u hours(1,1,1)

但这对我来说也不管用:(

给我一个错误AttributeError:'int'对象没有属性'hours\u 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()

您可以这样做:

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

您可以这样做:

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

另一种方法更像您的初始代码,其中
my\u slider\u value
将是一个类变量(与实例变量相反):


然后,您可以作为
屏幕1访问
我的值滑块
。我的值滑块
。请注意,在该访问中没有使用参数。这种方法的缺点是
我的值滑块
不是
属性
,因此您无法绑定到它。

另一种方法更像您的初始代码,其中
我的值滑块
将是类变量(与实例变量相反):


然后,您可以作为
屏幕1访问
我的值滑块
。我的值滑块
。请注意,该访问中没有使用参数。这种方法的缺点是
我的值滑块
不是
属性
,因此您无法绑定它。

非常感谢!这对我有用:)你是上帝这很好,但是这个类只工作一个,如何使它成为另一个类的访问?你可以通过引用
Screen1
,这可以从你的
ScreenManager
获得。如果我为另一个类键入
s=Screen1()
我的\u值\u滑块
打印(值)
这会给我一个0值Yes,因为这不是访问变量的正确方法。代码
s=Screen1()
创建
Screen1
的新实例,并且不引用GUI中的实例。您应该能够执行类似于
App.get\u running\u App().root.get\u screen('s1')。my\u value\u slider
。非常感谢!这对我来说很有用:)你是上帝这很好,但只适用于这个类,如何使它成为另一个类的访问?你可以通过引用
Screen1
,这可以从你的
ScreenManager
获得。如果我为另一个类键入
s=Screen1()
the_value=s.my_value_slider
打印(the_value)
这会给我一个0值Yes,因为这不是访问变量的正确方法。代码
s=Screen1()
创建
Screen1
的新实例,并且不引用GUI中的实例。您应该能够执行类似于
App.get\u running\u App().root.get\u screen('s1').my\u value\u滑块的操作。