禁用gtkbutton的发光效果

时间:2011-03-08 19:09:29

标签: python gtk pygtk

我想知道如何在mouseover上禁用gtkButton的发光效果。 请帮帮我。

提前谢谢。

3 个答案:

答案 0 :(得分: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_PRELIGHT块中设置正确的颜色,使它们与STATE_NORMAL块中的颜色相同。 (我猜这就是你对你的问题的意思)。

顺便说一下,还有另外两个状态在上面的方法中没有处理:STATE_SELECTED和STATE_INSENSITIVE。还必须指出,尽管这个功能的名称,但实际上并没有改变任何小部件的颜色。例如,它不会改变标签的颜色,因为标签会采用它的容器颜色。所以不要太认真地对待功能签名。

答案 1 :(得分: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主题产生影响。如果我发现了一个主题安全的方法,我将编辑我的答案。

答案 2 :(得分: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()