我最新的頭腦工作者是使用GTK3在Python3中構建一個愚蠢的小應用程序,其顏色除了按鈕上的霧灰色以外。過去幾天我一直在用Google搜索如何做到這一點,到目前爲止,我所嘗試過的一切都失敗了。不僅失敗了,而且失敗了,沒有任何錯誤消息給我提供關於發生的事情的任何線索。如何在Python GTK3中使用按鈕不同的顏色(使用gi)?
這是我的測試程序:
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()
我已經離開我的失敗嘗試中作爲註釋。如上所述,就應用而言,它看起來很有效,因爲上述變體都沒有產生任何錯誤消息。然而,沒有他們似乎爲我工作,因爲按鈕仍然是陳舊洗碗水的顏色。
僅供參考我在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;
}
我希望有人認爲這是有用的。
您需要使用事件盒來包裝它... http://stackoverflow.com/questions/7127093/pygtk-change-background-color-of-gtkhbox-widget – boosth 2012-08-19 12:17:22
感謝您的提示,@boosth。我真的放棄了GTK,並開始用tkinter/ttk實現我的應用程序,但我現在可能會再給GTK一個! – Bobble 2012-08-20 13:21:52