You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否拦截ListBox的行选择操作并自定义选择逻辑及触发默认动画?

问题原因

你当前为了自定义选中逻辑把ListBoxRow的selectable属性设为了False,ListBox默认的行按压、选中动画是和行的可选择属性绑定的,关闭可选后系统不会触发对应的默认交互反馈,才会出现动画缺失的问题。

解决方案

方案1(推荐):拦截选中信号替代关闭可选属性

不要关闭行的selectable属性,改为监听ListBox的select-row信号,在信号回调中判断是否允许选中,不符合条件时返回True即可阻止默认选中行为,同时完整保留默认的按压、选中动画:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib

lbr = Gtk.ListBox()

for i in rows:
    row = Gtk.ListBoxRow()
    # 保留默认可选属性,不要设为False
    row.set_selectable(True)
    row.set_activatable(True)
    row.add(Gtk.Label("Example"))
    lbr.add(row)

def on_select_row(listbox, row, user_data):
    if not row:
        return False
    # 先判断自定义条件
    if foo(row):
        # 符合条件,允许默认选中,返回False走默认逻辑
        return False
    # 不符合条件,弹出确认框
    dialog = Gtk.MessageDialog(
        transient_for=None,
        flags=0,
        message_type=Gtk.MessageType.QUESTION,
        buttons=Gtk.ButtonsType.YES_NO,
        text="确认要选中该行吗?",
    )
    response = dialog.run()
    dialog.destroy()
    if response == Gtk.ResponseType.YES:
        # 用户确认,允许选中
        return False
    else:
        # 用户取消,阻止选中
        return True

lbr.connect("select-row", on_select_row)

方案2:保留现有逻辑,手动触发按压动画

如果不想修改现有row-activated的逻辑,可以在回调中手动给行添加激活状态模拟按压动画:

def bar(_, row):
    # 先手动触发按压状态动画
    row.set_state_flags(Gtk.StateFlags.ACTIVE, False)
    # 150毫秒后清除激活状态,和默认动画时长对齐
    GLib.timeout_add(150, lambda: row.unset_state_flags(Gtk.StateFlags.ACTIVE))
    
    if foo(row):
        lbr.select_row(row)
        return
    # 弹出确认框逻辑
    dialog = Gtk.MessageDialog(
        transient_for=None,
        flags=0,
        message_type=Gtk.MessageType.QUESTION,
        buttons=Gtk.ButtonsType.YES_NO,
        text="确认要选中该行吗?",
    )
    response = dialog.run()
    dialog.destroy()
    if response == Gtk.ResponseType.YES:
        lbr.select_row(row)

内容的提问来源于stack exchange,提问作者atomvinter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:57:03