如何获取在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.kv
与 main.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()
我正在制作一个 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
.
有几种方法可以解决,例如使用属性,但我认为最简单的方法是将滑块的值作为参数传递给回调:
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.kv
与 main.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()