Python 当值更改时,如何使我的Kivy标签动态更新?
我正在制作一款kivy应用程序,遇到了一个无法更新标签的问题。我不确定从这里到哪里,但我希望日期值通过类ThirdMenu中的标签显示。这是我所有的代码,有点杂乱无章。我是新来的基维,并没有完全掌握所有的概念,所以很可能有很多错误 这是具有我要更改的标签的类:Python 当值更改时,如何使我的Kivy标签动态更新?,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在制作一款kivy应用程序,遇到了一个无法更新标签的问题。我不确定从这里到哪里,但我希望日期值通过类ThirdMenu中的标签显示。这是我所有的代码,有点杂乱无章。我是新来的基维,并没有完全掌握所有的概念,所以很可能有很多错误 这是具有我要更改的标签的类: class ThirdMenu(Screen, FloatLayout, EventDispatcher): theme_cls = ThemeManager() pickers = None previous_date = '' a =
class ThirdMenu(Screen, FloatLayout, EventDispatcher):
theme_cls = ThemeManager()
pickers = None
previous_date = ''
a = NumericProperty(0)
def __init__(self, **kwargs):
super(ThirdMenu, self).__init__(**kwargs)
global Date
#Labels
app = App.get_running_app()
app.D = Label(text=str(app.a),bold = True,text_size=(None,None),font_size="30sp",pos_hint={'center_x': 0.50, 'y': .8},size_hint_y=None,size = self.size,color=(1, 0, 0, 1))
self.add_widget(app.D)
#Buttons
FBBtn = Button(text ='Back to menu', size_hint =(1, .15), pos_hint ={'x': 0, 'y': 0.85})
self.add_widget(FBBtn)
FBBtn.bind(on_press = self.change_screen_menu)
Builder.load_string(KV)
self.pickers = Factory.Pickers()
self.add_widget(self.pickers)
#Screen manager / changing screens route
def change_screen_menu(self, *args):
self.manager.transition = SlideTransition(direction ='down')
self.manager.current = 'menu'
print('Screen is: ' + str(self.manager.current))
def on_a(self, instance, value):
app = App.get_running_app()
app.D.text = str(a)
print (a)
此类负载的KV串:
KV = """
<Pickers@Screen>
name: 'pickers'
BoxLayout:
orientation: 'vertical'
spacing: dp(20)
pos_hint: {'center_x': .5, 'center_y': .5}
size_hint_y: None
height: self.minimum_height
MDRaisedButton:
text: "Open date picker"
pos_hint: {'center_x': .5}
opposite_colors: True
on_release: app.show_example_date_picker()
MDLabel:
id: date_picker_label
theme_text_color: 'Primary'
halign: 'center'
Label:
id: Date
theme_text_color: 'Primary'
halign: 'center'
BoxLayout:
size_hint: None, None
size: self.minimum_size
pos_hint: {'center_x': .5}
Label:
theme_text_color: 'Primary'
text: "Start on previous date"
size_hint_x: None
width: self.texture_size[0]
color: 0, 0, 0, 0
MDCheckbox:
id: date_picker_use_previous_date"""
感谢您的阅读,我非常感谢。只要您有标签id,就可以在主文件中更改其值 (……) (……) 在main.py上 (……)
(…)代码中发生了一些奇怪的事情:
ThirdMenu
class不需要扩展所有这些类。只要扩展屏幕
就足够了,因为屏幕
已经是一个相对值
和一个事件调度程序
选择器
类扩展了屏幕
,但您没有将其用作屏幕
。您可以只扩展RelativeLayout
self.pickers=Factory.pickers()
。这将为您提供两个不同的、不相关的选取器
类实例。对在MyApp
类中创建的Pickers
实例进行更改将不会对ThirdMenu
中显示的Pickers
实例产生任何影响。您可以使用类似于下面第5点的内容来访问show_example_date_picker()
metod中的picker
的正确实例set_previous_date()
方法中,您使用app=app.get_running_app()
,但在该方法中,self是应用程序set_previous_date()
方法中,可以使用
self.root.get_screen('third')。pickers.ids.Date.text=str(Date_obj)这将访问
应用程序的根目录
,即屏幕管理器
,然后获取名为third
(ThirdScreen
)的屏幕
,然后访问ThirdScreen
的选择器属性,然后访问id
选择器词典
,它从中访问日期
(选择器
中的标签
),并将该标签
的文本
属性设置为拾取的日期。您能给出一个更简单的示例吗?
class MyApp(App):
theme_cls = ThemeManager()
pickers = None
previous_date = ''
a = StringProperty(0)
def build(self):
Window.size = (750,1334)
Window.clearcolor = (1, 1, 1, 1)
#set up of screen manager
sm = ScreenManager()
#Adding the different screens
sm.add_widget(MainMenu(name='menu'))
sm.add_widget(MainApp(name='main'))
sm.add_widget(SecondMenu(name='second'))
sm.add_widget(ThirdMenu(name='third'))
sm.add_widget(FourthMenu(name='fourth'))
sm.add_widget(TinaMenu(name='tinamenu'))
sm.add_widget(JohnMenu(name='johnmenu'))
#Activating the screen manager
return sm
def show_example_date_picker(self, *args):
self.pickers = Factory.Pickers()
if self.pickers.ids.date_picker_use_previous_date.active:
pd = self.previous_date
try:
MDDatePicker(self.set_previous_date, pd.year, pd.month, pd.day).open()
except AttributeError:
MDDatePicker(self.set_previous_date).open()
else:
MDDatePicker(self.set_previous_date).open()
def set_previous_date(self, date_obj):
global a
app = App.get_running_app()
self.previous_date = date_obj
self.pickers.ids.date_picker_label.text = str(date_obj)
app.a = self.pickers.ids.date_picker_label.text
print(app.a)
ThirdMenu.text = str(app.a)
Label:
id: Date
theme_text_color: 'Primary'
halign: 'center'
def change_date(newValue):
self.Date = newValue