2013-02-20 107 views
4

請原諒我的英語。爲什麼css風格不適用於GtkButton?

我想改變使用css文件的GtkButton的背景顏色,但我不能。 我嘗試了一些我在網上找到的例子,但都沒有成功。 我發佈了兩個例子。一個在Python 3.2.3和另一個在C 我使用的是Gtk + 3.6和Kubuntu 12.10。

這是其中之一的代碼:

from gi.repository import Gtk, Gdk 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     super().__init__() 
     vbox = Gtk.Box(spacing=10,orientation=Gtk.Orientation.VERTICAL) 
     self.add(vbox) 

     self.entries = [ Gtk.Entry() for i in range(3) ] 
     for e in self.entries: 
      vbox.pack_start(e, True, True, 0) 
      e.connect("changed", self.on_entry_changed) 
      e.set_text('123') 

     button=Gtk.Button(label='ok') 
     vbox.pack_end(button,True,True,0) 

    def on_entry_changed(self,entry): 
     ctx = entry.get_style_context() 
     if not entry.get_text().isnumeric(): 
      ctx.add_class('invalid') 
     else: 
      ctx.remove_class('invalid') 
cssProvider = Gtk.CssProvider() 
cssProvider.load_from_path('style.css') 
screen = Gdk.Screen.get_default() 
styleContext = Gtk.StyleContext() 
styleContext.add_provider_for_screen(screen, cssProvider, 
Gtk.STYLE_PROVIDER_PRIORITY_USER) # With the others GTK_STYLE_PROVIDER_PRIORITY values get the same result. 

window = MainWindow() 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main() 

和style.css文件

GtkEntry.invalid { 
    background-color: #ffaaaa; 
    background: #ffaaaa; 
} 

GtkButton { 
    engine: oxygen-gtk; /*tried also with 'none' and without setting engine*/ 
    background-color: green; 
    background: green; 
} 

的條目效果很好...的背景顏色變化。但按鈕不,並且沒有錯誤消息。

EDIT3:(刪除預覽編輯和改變一些標籤) 彙總...我嘗試了所有我在網絡上找到失敗了Python,C和C++代碼更改按鈕的顏色。我閱讀了所有我找到的教程和GTK + 3參考手冊。 所有我知道的問題是關於Kubuntu主題:如果我將GTK主題從'oxygen-gtk'更改爲'默認'(在GTK配置中),是我發現的唯一方法代碼運行良好,但這不是主意,按鈕看起來很可怕。

所以,問題是:

  1. 爲什麼我不能更改按鈕的背景顏色?
  2. 爲什麼我只用按鈕來解決這個問題? (適用於其他小工具)
  3. 我在這裏和GTK論壇上得到了答案,說這不是一個好的做法來改變按鈕的顏色,但是...如果我想要一個像這個圖像的菜單(link)(看到紅色框按鈕)?這是最好的練習嗎?

感謝和問候!

回答

1

這很複雜,但我不認爲它可以直接完成。

我相信核心原因是因爲按鈕不渲染背景。它所做的就是在其區域周圍渲染框架,然後渲染裏面的任何孩子。請記住,GtkButton是一個容器,它通常擁有一個GtkLabel作爲文本標籤,但可以容納任何widgetry。

我已經設法改變了文本標籤的背景顏色,但是隻有文本本身周圍更加複雜的盒子會受到影響,這不是你想要的。

間接的解決方案是繼承GtkButton以創建一個實際呈現其背景的變體。可以肯定的是,這對於主題非常粗魯,應該避免。

+0

感謝您的幫助!所以,如果這是一個非常粗魯的想法,那麼當開發人員想要創建個性化GUI時,該如何做?最好的做法是使用GTK3創建一個像[鏈接]這樣的菜單(http://c.fsdn.com/con/app/proj/scrmopenerp/screenshots/ProjetatyScrmOpenerp_2.png)? (請參閱紅色框中的按鈕) – 2013-02-22 15:22:21

2

這應該工作(我的意思是它爲我工作!):

GtkButton { 
    border-image: none; 
    background-image: none; 
    background-color: green; 
} 
+0

請詳細解釋以便更好地瞭解用戶。 – Shivaay 2013-09-09 08:47:36

+0

也適用於我。 – 2015-03-29 15:17:34

+0

沒有爲我工作,我不得不使用「按鈕」,而不是「GtkButton」。但是,它也繪製了關閉窗口的「X」按鈕,所以我不得不在style.css中使用'button.get_style_context()。add_class(「foo」)'和'button.foo'選擇器。 – Slazer 2017-08-02 11:01:57

5

我知道這已經很老了,但在前幾個谷歌搜索結果中彈出,所以我想我會分享我的經驗。

Gtk.Button有按鈕上的文字,不從默認按鈕繼承內嵌Gtk.Label,所以你必須明確地告訴它(或只是指定它的顏色):

GtkButton GtkLabel { 
    color: #fff; /* This changes the text color in the button */ 
} 

就@sciamp的回答而言,GTK主題爲背景和邊框設置了圖像,因此您必須手動將其刪除。