我有一个带有弹出菜单的托盘图标。我正在尝试设置此弹出窗口中菜单项的背景颜色。我可以设置文本颜色,但不能设置菜单项的背景颜色。

出现的背景是默认的 Ubuntu 橙色,我无法覆盖它。
我创建了一个示例应用程序来演示这个问题。只需将其复制粘贴到 .py 文件中,它就会运行。
from gi.repository import Gtk, Gdk
import sys
class TrayIcon:
def __init__(self):
self.statusicon = Gtk.StatusIcon()
self.statusicon.set_from_stock(Gtk.STOCK_MEDIA_PLAY)
self.statusicon.connect("popup-menu", self.OnShowPopupMenu)
window = Gtk.Window()
def OnShowPopupMenu(self, icon, button, time):
menu = Gtk.Menu()
first = self.GetMenuItem("First")
second = self.GetMenuItem("Second")
menu.append(first)
menu.append(second)
menu.show_all()
menu.popup(None, None, lambda w,x: self.statusicon.position_menu(menu, self.statusicon), self.statusicon, 3, time)
def GetMenuItem(self, txt):
menuItem = Gtk.MenuItem(txt)
screen = Gdk.Screen.get_default()
css_provider = Gtk.CssProvider()
#css_provider.load_from_data("GtkWidget { color:white; background-color: green; } GtkWidget:hover,GtkWidget:selected { color:white; background-color:pink;}")
css_provider.load_from_data("GtkMenuItem { color:#0f0; background-color: #f00; } GtkMenuItem:hover,GtkMenuItem:selected { color:#00f; background-color:#f00; font-weight:bold;}")
context = Gtk.StyleContext()
context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
menuItem.connect("button_press_event", self.exit)
return menuItem
def exit(self, a,b):
sys.exit()
TrayIcon()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
对于 GtkMenuItem,正常背景和 :hover 背景被忽略。对于 GtkWidget, :hover 背景被忽略。我的目标是在不禁用菜单项的情况下防止出现 Ubuntu 橙色。
有没有办法设置 GtkMenuItem 的背景和悬停/鼠标悬停颜色?(不使用'import gtk')
我正在使用 Ubuntu 12.04,默认主题。
编辑 1:为了增加一点清晰度,这就是我想要做的,但没有“导入 gtk”。
#Prevent background color when mouse hovers
style = menuItem.get_style().copy()
style.bg[gtk.STATE_SELECTED] = style.bg[gtk.STATE_NORMAL]
menuItem.set_style(style)
Run Code Online (Sandbox Code Playgroud)
Edit2:我也尝试过 override_background_color() 和 modify_bg,再次,橙色仍然显示在悬停时。以下是我尝试过的变体。
menuItem.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(1.0,0.0,0.0,1))
menuItem.modify_bg(Gtk.StateFlags.NORMAL,Gdk.color_parse("red"))
menuItem.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(1.0, 1.0, 1.0, 1.0))
menuItem.override_background_color(Gtk.StateFlags.SELECTED, Gdk.RGBA(1.0, 1.0, 1.0, 1.0))
menuItem.override_background_color(Gtk.StateFlags.FOCUSED, Gdk.RGBA(1.0, 1.0, 1.0, 1.0))
Run Code Online (Sandbox Code Playgroud)
Edit3:已提供答案,请参阅此帖子。
经过大量挖掘后,答案变得有些晦涩难懂。
background-color不起作用。我不得不使用background-unico-inner-stroke-width我最终找到了 Ubuntu 主题本身的 GTK3 CSS 文件来查看发生了什么,位于此处:
/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css
Run Code Online (Sandbox Code Playgroud)
我-unico-inner-stroke-width从上面的 CSS 文件中获取了该属性。我无法确定为什么background-color我的脚本被忽略,但至少在 Ubuntu 12.04 上确实如此。
我还被迫“重新设置”我正在更改的元素的背景和边框颜色,否则它们会显得很奇怪。这是我必须使用的最少 CSS
GtkMenuItem
{
border:@bg_color;
background:@bg_color;
}
GtkMenuItem:hover
{
background:@selected_bg_color;
}
GtkWidget
{
border: @bg_color;
}
#mymenu:hover
{
color:@fg_color;
background: @bg_color;
-unico-inner-stroke-width: 0;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我将单个 GtkMenuItem 的悬停颜色设置为与背景颜色相同,但如果您想将颜色设置为其他颜色,则必须background根据您的需要更改属性。
结果,一个没有悬停颜色的工作菜单项

下面是完整的 Python 代码:
from gi.repository import Gtk, Gdk
import sys
class TrayIcon:
def __init__(self):
self.statusicon = Gtk.StatusIcon()
self.statusicon.set_from_stock(Gtk.STOCK_MEDIA_PLAY)
self.statusicon.connect("popup-menu", self.OnShowPopupMenu)
self.statusicon.set_tooltip_text("HELLO")
window = Gtk.Window()
def OnShowPopupMenu(self, icon, button, time):
display = Gdk.Display.get_default()
screen = display.get_default_screen()
css_provider = Gtk.CssProvider()
gtk3Css = """GtkMenuItem {
border:@bg_color;
background:@bg_color;
}
GtkMenuItem:hover
{
background:@selected_bg_color;
}
GtkWidget
{
border: @bg_color;
}
#mymenu:hover
{
color:@fg_color;
background: @bg_color;
-unico-inner-stroke-width: 0;
}"""
css_provider.load_from_data(gtk3Css)
context = Gtk.StyleContext()
context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
menu = Gtk.Menu()
#menu.set_name('mymenu')
first = self.GetMenuItem("First")
first.set_name('mymenu')
second = self.GetMenuItem("Second")
menu.append(first)
menu.append(second)
menu.show_all()
menu.popup(None, None, lambda w,x: self.statusicon.position_menu(menu, self.statusicon), self.statusicon, 3, time)
def GetMenuItem(self, txt):
menuItem = Gtk.MenuItem()
menuItem.set_label(txt)
menuItem.connect("button_press_event", self.exit)
return menuItem
def exit(self, a,b):
sys.exit()
TrayIcon()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
如果你想设置其他背景颜色,你可以在上面的 CSS 中执行此操作
GtkMenuItem:hover
{
background:purple;
-unico-inner-stroke-width: 0;
}
Run Code Online (Sandbox Code Playgroud)
(或者在#mymenu:hover 中执行)

总之,我认为这可能是仅限于 Ubuntu 12.04 或 GTK 3.4.2 的问题,我通过运行确定,
pkg-config --modversion gtk+-3.0
Run Code Online (Sandbox Code Playgroud)
但我没有专业知识来确定这个问题的根源。