2016-02-11 3 views
1

Итак, я хочу отобразить ярлык, если кто-то пытается щелкнуть по нему, и файл сохранения еще не создан. Затем я хочу, чтобы он исчез. Цикл while работает, уменьшая значение alpha до 0. И он отображает метку, пока я не добавляю self.remove_widget(no_save), но затем он просто остается твердой меткой. Любая помощь будет оценена по достоинству. Или есть более простой способ сделать это?Наличие ярлыка в kivy

class StartMenu(Screen): 

    def check_save(self): 
     global save_state 
     if save_state == None: 
      color = (0,1,0,1) 
      while color[3] > 0: 
       no_save = Label(text='No save file found. Please press New Game', color=color) 
       self.add_widget(no_save) 
       color = color [:3] + (color[3] - (.1),) 
       time.sleep(.1) 
       self.remove_widget(no_save) 
+2

цикл 'while' вместе с' sleep' блокирует ваше приложение и очень плохую идею. Вместо этого взгляните на ['Animation's] (https://kivy.org/docs/api-kivy.animation.html) – zeeMonkeez

+0

Хорошо, я сделаю это! Я еще не слышал о них. – Arkyris

ответ

4

Вместо того, чтобы делать замирание из себя, почему бы не использовать встроенный в Animation функциональности? Попробуйте что-то вроде этого. Я также предлагаю переместить save_state из глобального мира в ваш класс, и вместо того, чтобы создавать и уничтожать ярлык каждого запуска, я создавал бы при инициализации и просто скрывал бы или показывал бы его по мере необходимости.

class StartMenu(Screen): 

    def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    self.save_state = None 
    no_save = Label('No save file found. Please press new game.', hidden=True) 
    self.add_widget(no_save) 


    def check_save(self): 
    if not self.save_state: 
     self.no_save.hidden = False 
     def hide_label(w): w.hidden = True 
     Animation(opacity=0, duration=1, on_complete=hide_label).start(self.no_save) 

Быстрый Shoutout в zeeMonkeys для указывая Animation решения в комментариях, прежде чем я сделал.

+0

Спасибо, я нашел страницу анимации, как предложил zeeMonkeez, и заставил ее работать. Однако у меня есть вопрос о глобальном. Мне нужно получить доступ к информации о состоянии сохранения в основном цикле игры, поэтому было бы целесообразно использовать глобальное значение тогда. (У меня есть код, так что если есть состояние сохранения, оно загружает его в переменную, и мне нужно получить доступ к этой информации в другом месте, есть ли лучший способ сделать это) – Arkyris

+0

@Arkyris, существует несколько способов обмена данными через виджеты. Одним из способов было бы просто получить доступ к свойству 'save_state' в вашем виджне« MainScreen »(или независимо от того, какая функция вашего основного игрового цикла) в качестве атрибута« StartMenu ». (т. е. в '__init__'' MainScreen', поместите 'self.start_menu = StartMenu (...)', а в вашем основном игровом цикле используйте 'self.start_menu.save_state'.) С другой стороны, если вы не думаете, что сохранение 'save_state' в качестве атрибута стоит того, вы можете просто использовать глобальную переменную. Я только изменил его в своем ответе, потому что глобальные переменные обычно считаются плохой практикой. – Kwarrtz

+0

Спасибо за ответ, я слышал, что глобалы считались плохой практикой, но я все еще новичок в программировании, поэтому я не знал о методе, который вы описали. Я буду использовать его, хотя теперь, когда я знаю об этом. Я также задавался вопросом о создании игрового цикла, должен ли я сделать его собственным классом или добавить его на экран, из которого люди играют в игру. Что считается лучшей практикой? – Arkyris

 Смежные вопросы

  • Нет связанных вопросов^_^