2016-02-11 69 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