Establezca el color de fondo de un elemento de menú Gtk3

Tengo un icono de bandeja con un menú emergente. Estoy tratando de establecer el color de fondo de los elementos del menú en esta ventana emergente. Puedo configurar el color del texto pero no el color de fondo del elemento del menú.

introduzca la descripción de la imagen aquí

El fondo que aparece es el color naranja predeterminado de Ubuntu, y no puedo anularlo.

He creado una aplicación de ejemplo que demuestra este problema. Simplemente cópielo y péguelo en un archivo .py y debería ejecutarse.

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() 

Para GtkMenuItem, el fondo normal y el fondo de desplazamiento se están ignorando. Para GtkWidget se ignora el fondo: hover. Mi objective es evitar que Ubuntu naranja aparezca sin deshabilitar el elemento del menú.

¿Hay alguna forma de configurar el fondo y el desplazamiento del mouse / mouse sobre un GtkMenuItem? (sin usar ‘import gtk’)

Estoy usando Ubuntu 12.04, tema por defecto.

Edit1 : Para agregar un poco de claridad, esto es lo que estoy tratando de hacer, pero sin ‘importar 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 : También he intentado override_background_color () y modify_bg, y una vez más, la naranja sigue apareciendo al pasar el cursor. Aquí hay variantes de lo que he intentado.

  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 : respuesta ha sido proporcionada, ver esta publicación .

Después de mucho cavar, la respuesta resultó ser algo oscura.

  • background-color no funciona. Tuve que usar background
  • También tuve que usar -unico-inner-stroke-width

Terminé en un archivo GTK3 CSS para el propio tema de Ubuntu para ver qué estaba pasando, que se encuentra aquí:

 /usr/share/themes/Ambiance/gtk-3.0/gtk-widgets.css 

-unico-inner-stroke-width la -unico-inner-stroke-width del archivo CSS anterior. No puedo determinar por qué se ignora el background-color en mi script, pero es, al menos en Ubuntu 12.04.

También me vi obligado a “restablecer” los colores de fondo y borde de los elementos que estaba cambiando, ya que de lo contrario parecerían extraños. Este es el CSS mínimo que tuve que usar

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

En este ejemplo, estoy configurando el color de desplazamiento de un único GtkMenuItem para que sea el mismo que el color de fondo, pero si desea establecer el color en otra cosa, tendría que cambiar la propiedad de background según sus necesidades.

Resultado, un elemento de menú en funcionamiento sin color de desplazamiento.

introduzca la descripción de la imagen aquí

Aquí está el código completo de 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() 

Si desea establecer otro color de fondo, puede hacer esto en el CSS anterior

  GtkMenuItem:hover { background:purple; -unico-inner-stroke-width: 0; } 

(o hacerlo en #mymenu: hover)

introduzca la descripción de la imagen aquí

En conclusión, creo que esto puede haber sido un problema limitado a Ubuntu 12.04 o GTK 3.4.2 que determiné ejecutando,

 pkg-config --modversion gtk+-3.0 

Pero no tengo la experiencia para determinar el origen de este problema.

Bueno, es C no python, pero esto funciona para mí. Nombré el menú “mymenu” de esa manera, puede utilizarlo sin usar GtkLabel, lo que afectaría a otras tags en la aplicación.

 /* COMPILE WITH: gcc -Wall -o icon3 `pkg-config --cflags --libs gtk+-3.0` icon3.c */ #include  #include  /* 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; } 

Archivo css:

 #mymenu { background-color: white; color: green; font-weight:bold; } #mymenu :hover { background-color: red; color: blue; font-weight:bold; }