【发布时间】:2012-08-09 07:08:31
【问题描述】:
我最近的头疼事是使用 GTK3 在 Python3 中构建一个愚蠢的小应用程序,按钮上的颜色不是雾灰色。在过去的几天里,我一直在谷歌上搜索如何做到这一点,到目前为止,我所尝试的一切都失败了。不仅失败了,而且默默地失败了,没有任何错误消息可以让我知道发生了什么。
这是我的测试应用:
from gi.repository import Gtk, Gdk
class ButtonWindow(Gtk.Window):
def __init__(self):
super().__init__(title="Button Test")
self.set_border_width(10)
hbox = Gtk.Box(spacing=10)
self.add(hbox)
hbox.set_homogeneous(False)
# make the button
button = Gtk.Button('Test Button')
hbox.pack_start(button, True, True, 0)
# try to change its colour ....
# button.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
# button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0, 1, 0, 1))
# button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00))
# button.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("green"))
# button.modify_bg(Gtk.StateType.ACTIVE, Gdk.color_parse("green"))
# button.modify_bg(Gtk.StateType.SELECTED, Gdk.color_parse("green"))
# attempt to change the style ....
# style = button.get_style().copy()
# style.bg[Gtk.StateType.NORMAL] = Gdk.color_parse('green')
# style.bg[Gtk.StateType.ACTIVE] = Gdk.color_parse('red')
# style.bg[Gtk.StateType.SELECTED] = Gdk.color_parse('blue')
# style.bg[Gtk.StateType.PRELIGHT] = Gdk.color_parse('black')
# button.set_style(style)
# ok, let's try changing the box ....
# hbox.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
# hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,1,0,1))
# hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00ff))
# hbox.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
window = ButtonWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
我将失败的尝试保留为 cmets。如上所述,就应用程序而言,它似乎已经工作,因为上述变体都不会生成任何错误消息。但是,没有它们似乎对我有用,因为按钮仍然是陈旧的洗碗水的颜色。
仅供参考,我在 Ubuntu 12.04 下使用 Python 3.2.3,并从标准存储库安装了 python3-gi 和 python3-gi-cairo。
有人可以指点我正确的方向吗?
编辑:以下是根据@mike 的回答重新设计的示例。这可行,但它存在一些问题,可能需要在一些后续问题中解决。问题是:
- 为什么在 Ubuntu 上必须使用
background而不是background-color,然后只用于按钮? - 我仍然无法让字体样式正常工作,但至少现在我有一个可以使用的示例。
- 可以将不同的样式/颜色应用于不同的按钮,例如基于文本或其他属性?
所以,代码:-
from gi.repository import Gtk, Gdk
class ButtonWindow(Gtk.Window):
def __init__(self):
super().__init__(title="Button Test")
self.set_border_width(10)
hbox = Gtk.Box(spacing=10)
self.add(hbox)
hbox.set_homogeneous(False)
# make the button
button = Gtk.Button('Test Button')
hbox.pack_start(button, True, True, 0)
# get the style from the css file and apply it
cssProvider = Gtk.CssProvider()
cssProvider.load_from_path('gtkStyledButtonTest.css')
screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider,
Gtk.STYLE_PROVIDER_PRIORITY_USER)
window = ButtonWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
css 文件如下所示:-
GtkWindow {
background-color: #0000ff;
}
GtkButton {
color: #ff0000;
background: #00ff00;
}
我希望有人觉得这很有用。
【问题讨论】:
-
你需要用事件框包装它...stackoverflow.com/questions/7127093/…
-
感谢您的提示,@boosth。我实际上已经放弃了 GTK 并开始使用 tkinter/ttk 实现我的应用程序,但现在我可能会再尝试一次 GTK!
标签: button colors python-3.x gtk3