2016-12-19 9 views
0

Я полуооо с Python, но новичок в Kivy, я знаю, что моя проблема связана с идентификатором метки, но я не могу ее решить, и поиск, похоже, не дает мне Что мне нужно.Kivy меняет текст на пиктограмме с помощью python

Я пытаюсь получить ярлык, чтобы отображать текущее время, поэтому я знаю, что у меня есть правильная структура с точки зрения обновления и т. Д., Но я уверен, что все это со ссылкой на идентификатор ярлыка каким-то образом и его, с чем бороться?

Следующий код работает нормально, отображает метки и т. Д., Пока я не попытаюсь обновить label_text.text, в этот момент я получаю сообщение об ошибке: AttributeError: 'float' object has no attribute 'lbl_time'. Я пробовал str(time.strftime("%H:%M:%S")), но это не решает.

from kivy.app import App 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import ListProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import ObjectProperty 
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition 
from kivy.uix.anchorlayout import AnchorLayout 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.clock import Clock 
import time 
from datetime import datetime 

class MainScreen(Screen): 

def update_time(self): 
    lbl_time = ObjectProperty() 
    MyTime = time.strftime("%H:%M:%S") 
    self.lbl_time.text = MyTime 

class DetailScreen(Screen): 
    pass 

class SettingsScreen(Screen): 
    pass 

class MyScreenManager(ScreenManager): 
    pass 



root_widget = Builder.load_string(''' 
    MyScreenManager: 
    MainScreen: 
    DetailScreen: 
    SettingsScreen: 

<MainScreen>: 
    name: 'main' 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: lbl_time 
      text: 'Time' 
      font_size: 60 
     Label: 
      text: 'Main2' 
      font_size: 30 
     GridLayout: 
      cols: 2 
      Label: 
       text: 'Bottom' 
       font_size: 30 
      Label: 
       text: 'Bottom1' 
       font_size: 30 

<DetailScreen>: 
    name: 'details' 

<SettingsScreen>: 
    name: 'settings' 

''') 
class ScreenManagerApp(App): 

    def build(self): 
     return root_widget 

    def on_start(self): 
     Clock.schedule_interval(MainScreen.update_time, 1) 

ScreenManagerApp().run() 
+0

Изменить метод _update_time_: ** Update_Time четкости (сам, * арг): MyTime = time.strftime ("% H:% M:% S") само. ids ['lbl_time']. text = MyTime ** – Dzmitry

+0

Привет - Извините, что не работает -> 'Файл MyApp.py", строка 20, в update_time self.ids ['lbl_time']. text = MyTime AttributeError : объект 'float' не имеет атрибута 'ids'' – northwarks

+0

Вам нужно позвонить * MainScreen() * для доступа к его методам 'Clock.schedule_interval (MainScreen(). update_time, 1)' – Dzmitry

ответ

0

Это была скорее проблема Python, а не Kivy. Вы вызывали update_time класса MainScreen, а не объекта/экземпляра MainScreen. В принципе, вам нужно будет сохранить ссылку на объект (self.main_screen) в методе build, а затем использовать его в on_start.

class ScreenManagerApp(App): 

    def build(self): 
     self.main_screen = MainScreen() 
     return self.main_screen 

    def on_start(self): 
     Clock.schedule_interval(self.main_screen.update_time, 1) 

Также вы не можете получить доступ к id за пределами языка kv, то есть в python. Вы должны ссылаться на идентификатор, добавив свойство, например. the_time:

<MainScreen>: 
    name: 'main' 
    the_time: _id_lbl_time 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: _id_lbl_time 

Незначительная проблема заключается в том, что update_time() принимает к параметрам. Кроме того, в вашем коде было довольно много странных вещей, поэтому я не смог запустить код. Я установил все выше в коде ниже:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import Screen 
from kivy.properties import ObjectProperty, StringProperty 
from kivy.clock import Clock 
import time 
from datetime import datetime 

Builder.load_string(''' 
<MainScreen>: 
    name: 'main' 
    the_time: _id_lbl_time 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      id: _id_lbl_time 
      text: 'Time' 
      font_size: 60 
''') 

class MainScreen(Screen): 

    def update_time(self, sec): 
     MyTime = time.strftime("%H:%M:%S") 
     self.the_time.text = MyTime 


class ScreenManagerApp(App): 

    def build(self): 
     self.main_screen = MainScreen() 
     return self.main_screen 

    def on_start(self): 
     Clock.schedule_interval(self.main_screen.update_time, 1) 

ScreenManagerApp().run() 
+1

Hey - All working - Спасибо - я думаю, что странные вещи, на которые вы ссылаетесь, - это контуры кода screenmanager, который я начал строить , похоже, что это не повлияло на работу кода, так что я оставил его до тех пор, пока не смогу обработать обновление метки. – northwarks