能否拦截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
相关产品推荐
相关产品推荐

