这是一个简单的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()
另一种方法更像你最初的代码,其中包括 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
所以你不能绑定到它。
你可以做这样的事情。
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