其他分享
首页 > 其他分享> > 设置Gtk3 MenuItem的悬停背景颜色

设置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