如何获取在kivy中定义的内部屏幕小部件的滑块的值

How to get the value of slider which defined inside screen widget in kivy

我正在制作一个 kivy 文件并与 python 文件链接。我在 kivy 中定义了屏幕内的滑块,并认为在 python 内进行访问。但是在 运行 下面的 main.py 文件

之后出现这样的错误 AttributeError: 'super' object has no attribute '__getattr__'

这里是main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition

class Maintenance(Screen):
    pass
class ScreenManagement(ScreenManager):
   pass

presentation = Builder.load_file("ex4.kv")

class ex4(App):
    def __init__(self, **kwargs):
        super(ex4, self).__init__(**kwargs)

    def build(self):
       return presentation
    def my_value(self):

        print(self.root.ids.slider1.value)



if __name__ == '__main__':
   ex4().run()

ex4.kv

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

ScreenManagement:
    transition:SlideTransition()

    Maintenance:
<Maintenance>:
    name: 'screen1'
    BoxLayout:
        orientation: 'vertical'

        Slider:
           id: slider1
           on_value:app.my_value()

id slider1 属于 Maintenace class 的实例。 ID 的范围限于它在 中声明的规则,因此,ScreenManagement 实例没有名为 slider1.

的 ID

有几种方法可以解决,例如使用属性,但我认为最简单的方法是将滑块的值作为参数传递给回调:

ex4.kv

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

ScreenManagement:
    transition: SlideTransition()
    Maintenance:

<Maintenance>:
    name: 'screen1'
    BoxLayout:
        orientation: 'vertical'

        Slider:
            id: slider1
            on_value: app.my_value(self.value)  # <<<<<<<<<<<

main.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition


class Maintenance(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


presentation = Builder.load_file("ex4.kv")


class Ex4(App):

    def build(self):
        return presentation

    def my_value(self, value):  # <<<<<<<<<<<
        print(value)


if __name__ == '__main__':
    Ex4().run()

请记住,您不需要 builder.load_file。如果您的 ex4.kvmain.py 位于同一目录中,只需:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition


class Maintenance(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass



class Ex4(App):

    def my_value(self, value):
        print(value)

if __name__ == '__main__':
    Ex4().run()