为什么Gtk3中的悬停动画忽略过渡时间和函数?

4 投票
2 回答
1852 浏览
提问于 2025-04-17 10:01

在新的gtk版本中,可以通过一个类似于css的文件来创建图形主题。

假设我们有一个css文件,名字叫做my-gtk-widgets.css

.button {
    border-radius: 0;
    border-style: solid;
}

.button:hover {
    transition: 3000ms linear;
    border-radius: 50;
}

还有以下的python代码:

from gi.repository import Gtk
from gi.repository import Gdk

def _destroy_cb(widget, data=None):
    Gtk.main_quit()

window = Gtk.Window()
window.connect("destroy", _destroy_cb)

screen = Gdk.Screen.get_default()

css_provider = Gtk.CssProvider()
css_provider.load_from_path('my-gtk-widgets.css')

context = Gtk.StyleContext()
context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)

box = Gtk.VBox()
window.add(box)

button = Gtk.Button('go-next')
box.pack_start(button, False, False, 0)

window.show_all()
Gtk.main()

运行这段代码后,会出现一个按钮,当鼠标悬停在上面时,按钮的边框圆角会发生变化。不过,这个变化是瞬间完成的,没有动画效果。

这里插入图片描述

这里插入图片描述

那么,为什么会这样呢?我需要不同版本的gtk、python等吗?还是说这个动画效果跟gtk主题有关(在我的情况下是Ubuntu默认的Ambience)?或者我的css文件有什么问题?

python版本:2.7.2+

gtk版本:3.0

补充说明:这个例子是对这个内容的修改版。

2 个回答

-1

把过渡效果加在 .button 上,而不是 .button:hover 上。

6

我对CSS不是很精通,但看起来你想在一个不支持过渡效果的属性上使用过渡/动画(根据这个列表border-radius是不支持过渡的)。你可以试试像background-color这样的属性,看看在你应用中的按钮上能否看到过渡效果(颜色变化的过渡效果可以在 - Gtk-3.0, python-2.7.1, FC15中看到)。

.button {
    background-color: #00ffff;
    border-style: solid;
}

.button:hover {
    transition: 1s linear;
    background-color: #00ff00;
}

希望这能帮到你!

撰写回答