如何使用python和kivy获得函数外的值
这是一个简单的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
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滑块的操作。