我最近的头脑是使用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()
我把失败的尝试留在了评论中。如上所述,就应用程序而言,它似乎有效,因为上述变化都不会产生任何错误消息。但是, none 它们似乎对我有用,因为按钮仍然是陈旧洗碗水的颜色。
仅供参考我在Ubuntu 12.04下使用Python 3.2.3,并在标准存储库中安装了python3-gi和python3-gi-cairo。
有人可以指出我正确的方向吗?
编辑:以下是基于@迈克答案的重复实例。这有效,但有一些问题,可能会在一些后续问题中得到解决。问题是:
background
必须在Ubuntu而不是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;
}
我希望有人觉得这很有用。
答案 0 :(得分:4)
GTK3中的首选方法是使用CSS进行样式设置。在Ubuntu 12.04下,您可能需要使用背景而不是背景颜色。但我不懂Python,所以我只想给出一个链接。
https://thegnomejournal.wordpress.com/2011/03/15/styling-gtk-with-css/
答案 1 :(得分:3)
尽管这是一个老问题,但我想提一个引用问题3的答案,仅供参考。
GTK3增加了样式类的概念。因此,要获得不同颜色的按钮,您可以直接将它们作为名称或在其上下文中添加样式类。所有这些都在他的回答中提供的链接麦克解释。
以下是一个简单的示例,说明如何使用样式类突出显示条目中的无效文本:
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('ok',name='ok-button')
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)
window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
使用style.css:
GtkEntry.invalid {
background-color: #ffaaaa;
background: #ffaaaa;
}
GtkButton#ok-button {
background-color: green;
background: green;
}
答案 2 :(得分:0)
受@boosth的启发,这是修改后的代码(包装按钮,并将颜色应用于包装器 - 请参阅注释为# <----
的行)。
但是,当它更改事件框的颜色时,按钮本身保持不变。所以,这不是我想要的,但到目前为止,这是最好的答案。
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')
buttonWrapper = Gtk.EventBox() # <----
buttonWrapper.add(button) # <----
hbox.pack_start(buttonWrapper, True, True, 0) # <----
# change the colour of the wrapper ....
buttonWrapper.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("green"))
buttonWrapper.modify_bg(Gtk.StateType.ACTIVE, Gdk.color_parse("red"))
buttonWrapper.modify_bg(Gtk.StateType.SELECTED, Gdk.color_parse("blue"))
window = ButtonWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
必须有办法做到这一点......