2011-03-08 44 views

回答

1

以下Python代碼將使按鈕的樣式的副本,請在gtk.STATE_PRELIGHT(鼠標懸停)狀態的背景顏色相同的顏色爲gtk.STATE_NORMAL,然後設置樣式後面的小工具。

import gtk 

window = gtk.Dialog() 
button = gtk.Button('Click Me') 

style = button.get_style().copy() 
style.bg[gtk.STATE_PRELIGHT] = style.bg[gtk.STATE_NORMAL] 
button.set_style(style) 

window.vbox.pack_start(button) 
window.show_all() 
window.run() 

因爲這不會影響按鈕的實際狀態,所以對代碼的其餘部分沒有副作用。

此代碼可能對GDK主題有影響。如果我發現這個主題安全的方法,我會編輯我的答案。

+0

爲了避免gdk主題問題*可能*我找到了一個解決方案:您可以在小部件實現後應用該樣式。使用'widget.connect('實現',函數)',然後添加一個執行樣式複製/編輯/應用方法的函數。 – musicamante 2015-10-13 00:25:59

2

這可能是你在找什麼。它是C++,但希望你可以把它翻譯成python等價物。該代碼更改了不同狀態下的窗口小部件的背景顏色。

void changeColor(Gtk::Widget* widget, double r, double g, double b) { 
    Glib::RefPtr<Gdk::Colormap> colormap = widget->get_colormap(); 
    Glib::RefPtr<Gtk::Style> style = widget->get_style()->copy(); 

    // STATE_NORMAL (most of the time) 
    { 
     Gdk::Color color; 
     color.set_rgb_p(r,g,b);   // <-- customize this 
     colormap->alloc_color(color); 
     style->set_bg(Gtk::STATE_NORMAL, color); 
    } 

    // STATE_PRELIGHT (when mouse hovers) 
    { 
     Gdk::Color color; 
     color.set_rgb_p(r*0.9,g*0.9,b*0.9); // <-- customize this 
     colormap->alloc_color(color); 
     style->set_bg(Gtk::STATE_PRELIGHT, color); 
    } 

    // STATE_ACTIVE (when clicked) 
    { 
     Gdk::Color color; 
     color.set_rgb_p(r*0.8,g*0.8,b*0.8); // <-- customize this 
     colormap->alloc_color(color); 
     style->set_bg(Gtk::STATE_ACTIVE, color); 
    } 

    widget->set_style(style); 
} 

你有興趣,使他們比STATE_NORMAL塊相同的STATE_PRELIGHT塊設定正確的顏色。 (我猜這是你的意思,你的問題)。

順便說一下,還有兩個其他狀態不在上述方法中處理:STATE_SELECTED和STATE_INSENSITIVE。還必須說明的是,儘管它的名字是這個函數,但實際上並沒有改變任何小部件的顏色。例如,它不會更改標籤的顏色,因爲標籤採用它的容器顏色。所以不要太認真對待功能簽名。

0
import gtk 

def enter(widget, event): 
    widget.set_state(gtk.STATE_NORMAL) 
    return False 

win = gtk.Dialog() 
button = gtk.Button('Button') 
button.connect_after('enter-notify-event', enter) 
win.vbox.pack_start(button, 0, 0) 
win.vbox.show_all() 
win.run() 
+0

這有效,但如果小部件的狀態對代碼中的其他內容很重要,則可能會導致問題。相反,改變按鈕的樣式可能會更好。 – 2011-03-22 22:45:59