设置Gtk3 MenuItem的悬停背景颜色
作者:互联网
我有一个带有弹出菜单的任务栏图标.我正在尝试在此弹出窗口中设置菜单项的背景色.我可以设置文本颜色,但不能设置菜单项的背景颜色.
出现的背景是默认的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,普通背景和:hover背景将被忽略.对于GtkWidget,:hover背景将被忽略.我的目的是防止在不禁用菜单项的情况下显示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.
解决方法:
经过大量的挖掘,答案似乎有些晦涩.
>背景色不起作用.我不得不使用背景
>我还不得不使用-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:hover中执行此操作)
总之,我认为这可能是我通过运行确定的仅限Ubuntu 12.04或GTK 3.4.2的问题,
pkg-config --modversion gtk+-3.0
但是我没有确定此问题根源的专业知识.
标签:gtk3,css,python 来源: https://codeday.me/bug/20191101/1981193.html