2017-04-14 307 views
1

我有一個kivy程序,它具有包含高爾夫比賽細節的'sqlite'數據庫,其中顯示信息&通過標準彈出功能彈出的警告消息pop_mess() 爲了測試目的,在函數set_test_db()中打開另一個「測試」數據庫。完成此操作後,我想更改彈出窗口的背景顏色,以警告用戶主數據庫未被使用。在python中更改kivy彈出窗口小部件背景

我試過這樣做(代碼在'set_test_db'結尾)。然而,雖然例程正確地檢索當前背景顏色,但它不會改變它。

有人能指出我的方向的解決方案。編碼方法對於更改小部件的文本屬性正常工作。 (類似的問題通常涉及文本屬性)。我已經使用了兩個列表&元組的顏色值。

在.ky文件

<CustomPopup>: 
    popup_message: popup_message 
    size_hint: .98, .75 
    id: popup_id 
    title: "Casual and Ancient" 
    title_align: 'center' 
    title_color: 1,.5,.3,1 
    BoxLayout: 
     id: contentbox 
     orientation: 'vertical' 
     TextInput: 
      id: popup_message 
      color: .3,.4,1.0,1 
      background_color: [.7,1.0,.2,1] 
      text: "text message goes here" 
      font_size: 16 
      font_name: 'RobotoMono-Regular' 

….. 
CaaRoot: 
<CaaRoot>: 
    orientation: 'lr-tb' 
    padding: 10 
    etc 
    ... 

在main.py

(個體= CaaRoot) ...

def pop_mess(self,message): 
     p_up=CustomPopup() 
     lab=p_up.ids['popup_message'] 
     lab.text=message 
     p_up.open() 

...

def set_test_db(self): 
     # on button in CaaRoot 
     # open test data base instead of real 
     if self.db != None: 
      print 'Cannot Open Test Data Base - already running' 
     else: 
    # open ‘test’ database 
    # set background colour of popup to warn user. 

     fn='/home/.... caatestdb.db 
     self.op_db(fn) 
     self.testing='TEST database' 

     p_up=CustomPopup() 
     lab=p_up.ids['popup_message'] 
     x=lab.background_color 

     new_col=[.9,.3,.3,1] 
     lab.background_color=new_col 

     self.pop_mess('color set to : '+str(new_col)+ ' was : '+str(x)) 

的彈出式窗口,

color set to : [0.9, 0.3, 0.3, 1] was : [0.7, 1.0, 0.2, 1]

(背景仍然設定爲[0.7,1.0,0.2,1])

回答

0

在我的問題,我遇到了類似的問題,他們的進一步調查(改變Kivy背景彈出)

事實上,解決方法是「非直觀的」涉及「繼承」的Canvas元素(?)的屬性使我意識到(記住?),而不是一些小部件沒有完整的範圍可修改的屬性。

我正在檢索的'background_color'屬性是一個從Canvas繼承的屬性,不能輕易更改。

我通過創建一個'popup'小部件來避免這個問題,只要我想使用它而不是修改一個已經存在的小部件。我仍然無法(簡單地)更改彈出框的background_color,但是我可以更改父元素的背景顏色,以便用戶的眼睛可以立即看到不同的東西。我也可以在調用彈出消息函數時更改文字顏色。

def pop_mess(self,message,colour=(.9,.6,.9,1)): 
    # 
    # text color can ve overridden by the 'colour' parameter 
    # self.backc can be set as required to set the color behind the 
    # popup depending on circumstances 


popup=Popup(title='Casual & Ancient', \ 
     content=Label(text=message,color=colour,\ 
         font_name = 'RobotoMono-Regular'),\ 
       size_hint=(.98,.75),background_color=self.backc) 


    popup.open() 

我不能完全肯定的分析是正確的,或者可能有一些副作用,但它似乎工作正常(而且比較簡單的代碼)

0

看一看kivymd ,這很好地解決了這些問題。它基本上是基於Google's Material Design的kivy的一個非常優雅的模板。 對我來說,它使得所有的色彩和外觀變得更容易,尤其是當我不是設計師而是程序員時。

該Demo還有一套非常完整的例子,包括彈出窗口。

+0

感謝您的鏈接。我克隆了'md'並嘗試運行'kitchen sink'演示,但因'ImportError:No module named recycleview '和'Unable to import package'kivymd.menu.MDDropdownMenu'失敗,我想我已經沒有了我的深度與kivy的某些方面,雖然它做我所需要的。 – Iain1940

+0

RecycleView在Kivy圖書館中非常新穎,您可能需要從Kivy-Garden下載版本。看看還有其他一些不錯的小工具。另一種可能性是克隆1.9.2-dev。看看[link](https://kivy.org/docs/api-kivy.uix.recycleview.html)recycleview是在1.10版本中添加的 – Fari