2016-04-16 145 views
0

我正在嘗試編寫一個程序,如果按下按鈕,Label部件的部分文本的顏色會發生變化。更改Kivy部件的部分文本的顏色

例如,有一個文本爲「1/0」的標籤小部件。現在,如果我按下按鈕,1的顏色會變爲某種指定的顏色。這是我嘗試過的節目:

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.lang import Builder 
from kivy.utils import get_color_from_hex 

Builder.load_string(''' 
#: import get_color_from_hex kivy.utils.get_color_from_hex 
<b>: 
    orientation: 'horizontal' 
    Button: 
     text: 'Press Me' 
     on_press: num.text[0].color = get_color_from_hex('#04d3ff') 

    Label: 
     id: num 
     text: '1/0' 
''') 

class b(BoxLayout): 
    pass 

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

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

這是錯誤我得到:

Traceback (most recent call last): 
    File "b.py", line 28, in <module> 
    main().run() 
    File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 828, in run 
    runTouchApp() 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 487, in runTouchApp 
    EventLoop.window.mainloop() 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 619, in mainloop 
    self._mainloop() 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/window_sdl2.py", line 362, in _mainloop 
    EventLoop.idle() 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 330, in idle 
    self.dispatch_input() 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 315, in dispatch_input 
    post_dispatch_input(*pop(0)) 
    File "/usr/lib/python2.7/dist-packages/kivy/base.py", line 221, in post_dispatch_input 
    listener.dispatch('on_motion', etype, me) 
    File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/__init__.py", line 1030, in on_motion 
    self.dispatch('on_touch_down', me) 
    File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 
    File "/usr/lib/python2.7/dist-packages/kivy/core/window/__init__.py", line 1046, in on_touch_down 
    if w.dispatch('on_touch_down', touch): 
    File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 
    File "/usr/lib/python2.7/dist-packages/kivy/uix/widget.py", line 432, in on_touch_down 
    if child.dispatch('on_touch_down', touch): 
    File "kivy/_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7699) 
    File "/usr/lib/python2.7/dist-packages/kivy/uix/behaviors/button.py", line 110, in on_touch_down 
    self.dispatch('on_press') 
    File "kivy/_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7654) 
    File "kivy/_event.pyx", line 1224, in kivy._event.EventObservers.dispatch (kivy/_event.c:13497) 
    File "kivy/_event.pyx", line 1108, in kivy._event.EventObservers._dispatch (kivy/_event.c:12329) 
    File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1557, in custom_callback 
    exec(__kvlang__.co_value, idmap) 
    File "<string>", line 7, in <module> 
AttributeError: 'str' object has no attribute 'color' 

編輯:解

這編輯是爲那些誰恰巧碰上了類似的情況,並從谷歌搜索這裏登陸。 Inclement的解決方案非常完美。這是KV語言解決方案代碼:

<b>: 
    orientation: 'horizontal' 
    Button: 
     text: 'Press Me' 
     on_press: num.text = "[color=#04d3ff]1[/color]/0" 
     on_release: num.text = "[color=#ffffff]1[/color]/0" 

    Label: 
     id: num 
     markup: True 
     text: '1/0' 

回答

1

使用Kivy的基本markup syntax設置顏色,用在標籤markup: True一起。

+0

我現在遇到了另一個問題。 :\如果有多個標籤?如果我想一起更改多個標籤的第一個字符,該怎麼辦? –

0

對於評論中的第二個問題,你問:「我現在遇到了另一個問題。:\如果有多個Label?怎麼辦?如果我想將多個Labels的第一個字符放在一起?你應該打開一個新的問題,並提供一些代碼。

然而,乍一看,似乎你可以簡單地通過標籤循環,做到以下幾點:

  1. 獲取標籤的當前文本(label.text)

  2. 更新使用第一個字符的標記來標記顏色。例如,如果label.text =「my_text」,我可以通過更新突出的標籤文本的「M」的標籤內的以下內容:

    text = '[color=FFFF00]'+label.text[0]+'[/color]'+label.text[1:] 
    

這個答案假定你有一組現有標籤,並且您想要修改每個標籤的第一個字符。沒有代碼,很難給出更具體的答案,但是這種一般方法是可行的。