2016-02-11 61 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」一起阻止了您的應用程序,並且是一個非常糟糕的主意。相反,看看['動畫'](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) 

快速大喊答題節目環節以zeeMonkeys在評論指出了Animation解決方案,我之前做過。

+0

謝謝我按照zeeMonkeez的建議找到了動畫頁面,並讓它工作。不過,我確實有一個關於全球的問題。我需要訪問主遊戲循環中的保存狀態信息,那麼適用於全局的話是適當的。 (我有代碼,所以如果有一個保存狀態發現它加載到變量,我需要在其他地方訪問該信息,有沒有更好的方式來做到這一點) – Arkyris

+0

@Arkyris,有多種方式可以跨數據共享小部件。一種方法是簡單地訪問'MainScreen'小部件中的'save_state'屬性(或者您的主要遊戲循環函數所在的位置)作爲'StartMenu'的屬性。 (即在MainScreen的'__init__'中,放置'self.start_menu = StartMenu(...)',並在你的主遊戲循環中使用'self.start_menu.save_state')。另一方面,如果你不認爲把'save_state'作爲一個屬性是值得的,你可以使用一個全局變量。我只是在我的答案中改變了它,因爲全局變量通常被認爲是不好的做法。 – Kwarrtz

+0

謝謝你的迴應,我聽說全局變化被認爲是不好的做法,但我仍然是編程新手,所以我沒有意識到你描述的方法。儘管現在我知道了,但我仍會使用它。我還想知道製作遊戲循環,我應該把它製作成自己的課程還是將它添加到人們玩遊戲的屏幕上。什麼被認爲是最佳實踐? – Arkyris