Я использую Gtk. Виджет IconView в моем приложении для выбора различных типов элементов. Путем IconView работает, следующее:
Я всегда находил его путающий, что дополнительный двойной щелчок необходим, когда большинство подобных кнопке виджетов в рабочем столе просто требует одиночного нажатия. Теперь у меня только что была обратная связь от нескольких пользователей, которые находят это сбивающим с толку (кто-то думал, что это была ошибка, что нажатие на кнопку "ничего не сделало"), таким образом, я решил изучить, как изменить то поведение.
Идеально, я хотел бы, чтобы IconView вел себя следующим образом:
Теперь я ничто не нашел очевидным в свойствах виджета, чтобы заставить его вести себя как этот. Кто-либо знает, как или могло ли это быть достигнуто?
Одно из решений (но только для активации одним щелчком) имеет смысл использовать сигнал selection_changed IconView (поскольку выбор IconView основан на одном щелчке).
Пример, предполагающий рабочий сигнал on_item_activation:
def on_icon_view_selection_changed(self, widget):
self.on_item_activated(widget, widget.get_selected_items()[0])
GtkIconView - это не расположение виджетов кнопок в таблице. По сути, это особый случай GtkTreeView, элементы которого расположены в виде сетки, а не списка / дерева. Я думаю, что для выделения элементов при наведении курсора требуется GTK +. Также потребуется исправление для добавления API, чтобы активировать один щелчок или двойной щелчок, однако эту функцию можно реализовать поверх существующего API виджета, прослушивая сигнал button_press_event
на виджете, действуя соответственно.
Вы, кажется, в последнее время изучаете ограничения Gtk: -)
Прежде всего, ответ добейса кажется правильным.
Tree- и List-Stores - хороший выбор для коллекций. Большие объемы данных, которые идентичны по типу, но различаются по мета-контенту (например, музыкальная коллекция, где каждая пьеса имеет исполнителя, альбом, название, но фактическое имя исполнителя, название альбома, название заголовка изменяется).
Хорошая особенность этих виджетов состоит в том, что они легко сортируются, можно выбирать многие элементы (например, в режиме «резиновой ленты»), и вам требуется относительно небольшое количество строк кода для добавления тысяч похожих элементов.
Изменение поведения TreeView или ListView в отношении щелчков / наведения и т. Д. На уровне для приложения является плохой идеей, потому что это портит то, как пользователи ожидают вашего приложение вести себя. Вы сами это выяснили, основываясь на реакции, которую вы описали в своем вопросе.
Ваша проблема, однако, в том, что пользователи не поняли, что ваш виджет является TreeView / ListView, вместо этого они подумали, что это несколько кнопок. И это, кажется, имеет смысл, основываясь на вашем скриншоте.
Кнопки предназначены для запуска действия (например, остановки, воспроизведения, паузы) или для связи с программой (например, «ОК», «Отмена») или даже в качестве ссылки на другое представление (см. LinkButton). У них обычно нет (абстрактного) объекта или предмета, связанного с ним (например, «Sammy Davis Jr» от «Movits!» Из альбома «Out of my head»).
Итак, хотя неконфигурируемое поведение кликов является недостатком gtk, оно должно быть в любом случае только на глобальном уровне для каждого пользователя.
То, что вам нужно, это, вероятно, сетка с кнопками . (Кнопки также могут содержать значки).
Вот как я заставил свой Iconview реагировать на положение указателя, чтобы получить эффект наведения и одиночные щелчки левой и правой кнопки мыши.
Вы должны активировать указатель-движение-уведомление для виджета, а затем преобразовать x, y-позицию указателя в путь вида иконки:
...
self.iconview.add_events(Gdk.EventMask.POINTER_MOTION_MASK)
self.iconview.connect("item-activated", self.iv_icon_activated)
self.iconview.connect("button-press-event", self.on_mouse_click)
self.iconview.connect("motion-notify-event", self.on_pointer_motion)
def on_pointer_motion(self, widget, event):
path= self.iconview.get_path_at_pos(event.x, event.y)
if path !=None:
self.iconview.select_path(path)
#If we're outside of an item, deselect all items (turn off highlighting)
if path == None:
self.iconview.unselect_all()
def on_mouse_click(self,widget, event):
if event.type == Gdk.EventType.BUTTON_PRESS:
path=self.iconview.get_selected_items()[0]
#if right click activate a pop-up menu
if event.button == 3 and path != None:
self.popup.popup(None, None, None, None, event.button, event.time)
#if left click, activate the item to execute
if event.button == 1 and path != None:
self.iv_icon_activated(widget, path)