2016-04-17 15 views
0

複数のラベルのテキストを大文字に変更するプログラムを作成しています。しかし、私のプログラムは、最後のテキストだけを大文字に変更するようです。これが私のプログラムです。ここでは、cのみが大文字に変換されています。 aとbは小文字のままです。どこが間違っていますか?Kivyのテキストの変更例

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.togglebutton import ToggleButton 
from kivy.lang import Builder 

Builder.load_string(''' 
<box>: 
    ToggleButton: 
     text: 'Caps Lock' 
     on_state: 
      if self.state == 'down': lol.text = lol.text.upper() 
      elif self.state == 'normal': lol.text = lol.text.lower() 

    Label: 
     id: lol 
     text: 'a' 

    Label: 
     id: lol 
     text: 'b' 

    Label: 
     id: lol 
     text: 'c' 
''') 

class box(BoxLayout): 
    pass 

class main(App): 
    def build(self): 
     return box() 

if __name__ == "__main__": 
    main().run() 

答えて

1

idプロパティはルール内で一意です。あなたはそれを2回上書きしました。私が示唆しているのは、各ラベルに一意のidを与え、その内容を大文字または小文字に設定する関数(box)を書くことです。


ループを備えたバージョン、代わりに各ラベルに固有のidを与える:

Builder.load_string(''' 
<Box>: 
    toggle: toggle 

    ToggleButton: 
     id: toggle 
     text: 'Caps Lock' 
     on_state: root.change_labels() 

    Label: 
     text: 'a' 

    Label: 
     text: 'b' 

    Label: 
     text: 'c' 
''') 


class Box(BoxLayout): 

    toggle = ObjectProperty() 

    def change_labels(self): 
     for child in self.children[:3]: 
      if self.toggle.state == 'down': 
       child.text = child.text.upper() 
      else: 
       child.text = child.text.lower() 
+0

私はそれを行うための一つの方法です知っているが、このためのショートカットはありますか?それはコピーペーストの仕事がたくさんあると思いませんか? –

+1

@ParthibBiswasループを使用してコードサンプルを使用して回答を編集しました。マジックナンバー「3」の使用を避ける他の方法もありますが、これは最短です。 – jligeza

+0

そのより明確な今! –

関連する問題