2014-04-08 30 views
-1

所以作爲遊戲的一部分,我有一個動畫文本窗口,可以彈出每秒打印每個單詞。爲什麼我只能在我的方法中只運行一行?

這裏的問題是方法「eachwordprint」,在遊戲中被重複調用,但我只想運行newmessage.text.split一次。我只是把它放在init中,但在遊戲中,我在不同的時間更改字符串,所以每次更改字符串時都需要拆分字符串。

我試着做

if self.counter <=1: 
    words = newmessage.text.split(' ') 

但這不起作用(我不知道爲什麼)。關於如何更好地實現我想要做的事情的任何建議?

class NewLabel(ButtonBehavior, Label): 
    def __init__(self, **kwargs): 
     super(NewLabel, self).__init__(**kwargs) 
     self.font_name='PressStart2P.ttf' 
     self.font_size=16 
     self.text=kwargs['text'] 
     self.text_size=(Window.width*.70, Window.height*.23) 
     self.mipmp = True 
     self.line_height=1.5 
     self.markup = True 
     self.counter=0 
     #self.words = self.text.split(' ') 



    def eachwordprint(self, *args): 
     self.counter += 1 
     if self.counter <=1: 
      words = newmessage.text.split(' ') 
     print "counter: ", self.counter 
     print "word length", len(words) 
     if self.counter <= 1: 
      anim = Animation(size_hint=(1, .25), duration=1.8) 
      anim.start(messagebox) 
      self.text='' 
     if len(words) > self.counter: 
      self.text += words[self.counter] 
      self.text += " " 
     else: 
      anim2 = Animation(size_hint=(1, 0), duration=1.8) 
      anim2.start(messagebox) 
      #messagebox.remove_widget(self) 
      return False 

newmessage = "this is a test hello. this is a test." 
+0

「這不起作用」以什麼方式?它不應該是'self.words'嗎? – ooga

+0

你確定計數器變量不斷增加? – aIKid

+0

你確定這是實際的代碼嗎? 'newmessage.text.split('')'無效,字符串沒有'text'屬性。 'newmessage'意思是'NewLabel'的一個實例嗎? –

回答

0

你可以memoize的分裂

MC = {} 


def wrapper(fn): 
    def inner(arg): 
     if not MC.has_key(arg): 
      MC[arg] = fn(arg) 
     return MC[arg] 
    return inner 

@wrapper 
def myfn(x): 
    print x 

myfn(1) 
myfn(1) 
myfn(2) 

所以基本上輸出發生了什麼是你寫你的文字劃分功能這樣

@wrapper 
def split(text): 
    return text.split(' ') 

,每次你想NewMessage作爲的分裂。文本,你稱它分裂(newmessage.text)。包裝器將首先檢查文本是否已經遇到,如果是,則返回值,或者調用該函數並拆分並存儲它以備後用。

可以運行如果這裏http://codebunk.com/b/-JJzVKR8KgtdaIIsmODh

0

上面的代碼你newmessage正在由不需要了解NewLabel比如你代碼的其他部分修改,我可能會創建一個類來封裝newmessage行爲:

class Message(object): 
    def __init__(self, message): 
     self.set_text(message) 
    def set_text(self, message): 
     self.text = message.split(' ') 

newmessage = Message("this is a test hello. this is a test.") 

然後把它作爲傳遞給NewLabel一個參數:

class NewLabel(ButtonBehavior, Label): 
    def __init__(self, **kwargs): 
     ... 
     self.message = kwargs['message'] 

    def eachwordprint(self, *args): 
     words = self.message.text 
     print "counter: ", self.counter 
     print "word length", len(words) 
     ... 

每當你需要改變的消息,你會怎麼做:

newmessage.set_text('this is the new test') 

不過,如果你總是設置在知道你NewLabel部分代碼的消息文本,那麼就將它們直接添加到NewLabel類中:

class NewLabel(ButtonBehavior, Label): 
    def __init__(self, **kwargs): 
     ... 
     self.set_text(kwargs['message']) 

    def set_text(self, text): 
     self.words = text.split(' ') 

    def eachwordprint(self, *args): 
     words = self.words 
     print "counter: ", self.counter 
     print "word length", len(words) 
     ... 
相關問題