gpt4 book ai didi

button - 如何在Python GTK3中使按钮不同颜色(使用gi)?

转载 作者:行者123 更新时间:2023-12-02 22:27:20 25 4
gpt4 key购买 nike

我最近最头疼的事情是使用 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()

我已将失败的尝试作为评论留下。如上所述,就应用程序而言,它似乎有效,因为上述变体都不会生成任何错误消息。然而,它们似乎都不适合我,因为按钮仍然是不新鲜的洗碗水的颜色。

仅供引用,我在 Ubuntu 12.04 下使用 Python 3.2.3,并从标准存储库安装了 python3-gi 和 python3-gi-cairo。

有人可以给我指出正确的方向吗?

编辑:以下是基于@mike的答案重新设计的示例。这是可行的,但有一些问题,可能会在一些后续问题中得到解决。问题是:

  1. 为什么在 Ubuntu 上必须使用 background 而不是 background-color,并且仅用于按钮?
  2. 在使字体样式正常工作方面仍然存在一些问题,但至少现在我有一个可以使用的示例。
  3. 可以将不同的样式/颜色应用于不同的按钮,例如基于文本或其他一些属性?

所以,代码:-

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;
}

我希望有人觉得这很有用。

最佳答案

虽然这是一个老问题,但我想添加一个针对问题 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;
}

关于button - 如何在Python GTK3中使按钮不同颜色(使用gi)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11927785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com