我有一个带有弹出菜单的托盘图标。我试图在此弹出窗口中设置菜单项的背景颜色。我可以设置文本颜色,但不能设置菜单项的背景颜色。
出现的背景是默认的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()
对于GtkMenuItem,忽略正常背景和:悬停背景。对于GtkWidget:忽略悬停背景。我的目的是防止Ubuntu橙色显示而不禁用菜单项。
有没有办法设置GtkMenuItem的背景和悬停/鼠标悬停颜色? (不使用'import gtk')
我使用的是Ubuntu 12.04,默认主题。
Edit1 :为了增加一点清晰度,我正在尝试这样做,但没有'import 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)
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))
Edit3 :已提供答案,请参阅this post。
答案 0 :(得分:3)
经过大量挖掘后,答案变得有点模糊。
background-color
不起作用。我不得不使用background
-unico-inner-stroke-width
我最终找到了一个用于Ubuntu主题的GTK3 CSS文件,看看发生了什么,位于:
/usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css
我从上面的CSS文件中获取了-unico-inner-stroke-width
属性。我无法确定为什么我的脚本中的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;
}
在此示例中,我将单个GtkMenuItem的悬停颜色设置为与背景颜色相同,但如果要将颜色设置为其他颜色,则必须更改background
根据您的需要提供财产。
结果,一个没有悬停颜色的工作MenuItem
以下是完整的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()
如果您想设置其他背景颜色,可以在上面的CSS中执行此操作
GtkMenuItem:hover
{
background:purple;
-unico-inner-stroke-width: 0;
}
(或在#mymenu中执行:悬停)
总之,我认为这可能是一个仅限于Ubuntu 12.04或GTK 3.4.2的问题,我通过运行来确定,
pkg-config --modversion gtk+-3.0
但我没有专业知识来确定这个问题的根源。
答案 1 :(得分:1)
嗯,这不是蟒蛇,但这对我有用。我将菜单命名为“mymenu”,您可以在不使用GtkLabel的情况下对其进行样式设置,这会影响应用程序中的任何其他标签。
/* COMPILE WITH: gcc -Wall -o icon3 `pkg-config --cflags --libs gtk+-3.0` icon3.c */
#include <gtk/gtk.h>
#include <string.h> /* for CSS */
static void cb_left_click(GtkStatusIcon *icon, gpointer data)
{
static GtkWidget *window = NULL;
if (window == NULL) {
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Status Icon");
g_signal_connect( window, "delete-event", G_CALLBACK(gtk_main_quit), NULL );
gtk_widget_show(window);
}
}
static void cb_right_click(GtkStatusIcon *icon, int button, int time, gpointer data)
{
GtkWidget *menu;
menu = gtk_menu_new ();
gtk_widget_set_name(GTK_WIDGET(menu),"mymenu");
GtkWidget *item1 = gtk_menu_item_new_with_label("First");
GtkWidget *item2 = gtk_menu_item_new_with_label("Second");
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item1);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), item2);
gtk_widget_show_all(menu);
gtk_menu_popup(GTK_MENU(menu),
NULL,
NULL,
gtk_status_icon_position_menu,
icon,
button,
time);
}
int main(int argc, char *argv[])
{
GtkStatusIcon *icon;
/*-- CSS ------------------*/
GtkCssProvider *provider;
GdkDisplay *display;
GdkScreen *screen;
/*---------------------------*/
gtk_init(&argc, &argv);
icon = gtk_status_icon_new_from_stock (GTK_STOCK_MEDIA_PLAY);
g_signal_connect (G_OBJECT(icon), "activate", G_CALLBACK(cb_left_click), NULL);
g_signal_connect (G_OBJECT(icon), "popup-menu", G_CALLBACK(cb_right_click), NULL);
/*---------------- CSS ----------------------------------------------------------------------------------------------------*/
provider = gtk_css_provider_new ();
display = gdk_display_get_default ();
screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
gsize bytes_written, bytes_read;
const gchar* home = "/home/mike/icon3.css";
GError *error = 0;
gtk_css_provider_load_from_path (provider,
g_filename_to_utf8(home, strlen(home),
&bytes_read, &bytes_written, &error),
NULL);
g_object_unref (provider);
/*-------------------------------------------------------------------------------------------------------------------------*/
gtk_main();
return 0;
}
Css文件:
#mymenu {
background-color: white;
color: green;
font-weight:bold;
}
#mymenu :hover {
background-color: red;
color: blue;
font-weight:bold;
}