Я хотел бы создать простой набор инструментов в Gtk3 (на самом деле pygtk), аналогичный основному выбору инструментов в GIMP, который переставляет кнопки в соответствии с их шириной. Как правильно это сделать? Я нашел два возможных способа, используя FlowBox и ToolPalette, но оба они кажутся слишком сложными и поэтому неоптимальными.
Борьба с ToolPalette: ToolPalette имеет возможность скрывать любую группу инструментов, и кажется, для меня эта функция не может быть отключена. Так что всегда есть ненужная верхняя панель.
Борьба с FlowBox: FlowBox имеет свой собственный способ выбора кнопок (я не хочу использовать его, потому что я хочу также выбрать инструмент вне панели инструментов ). Это может быть отключено set_selection_mode(Gtk.SelectionMode.NONE)
, однако элементы FlowBox все еще активны в смысле навигации по клавиатуре. Это делает навигацию клавиатуры панели инструментов чрезвычайно запутанной - каждая кнопка может быть «внутренне подсвечена» или «внешне подсвечена» и только с «внутренним выделением», она может фактически выбирать ее пробелом / вводом.
Пример кода:
import gi as gtk_import
gtk_import.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk
class ToolboxWindow(Gtk.Window):
def __init__(self):
super(ToolboxWindow, self).__init__()
self.resize(150, 100)
self.connect("key-press-event", self.on_key_press)
self.make_toolbox_flowbox() # FlowBox implementation
#self.make_toolbox_toolpalette() # ToolPalette implementation
self.add_tools()
self.show_all()
def make_toolbox_flowbox(self):
self.toolbox = Gtk.FlowBox()
self.toolbox.set_valign(Gtk.Align.START)
self.toolbox.set_selection_mode(Gtk.SelectionMode.NONE)
self.add(self.toolbox)
def make_toolbox_toolpalette(self):
palette = Gtk.ToolPalette()
self.toolbox = Gtk.ToolItemGroup()
palette.add(self.toolbox)
self.add(palette)
def on_key_press(self,w,e):
keyval = e.keyval
keyval_name = Gdk.keyval_name(keyval)
if keyval_name == "Escape":
Gtk.main_quit()
def add_tools(self):
icons = [
"edit-cut", "edit-paste", "edit-copy",
"edit-clear", "edit-delete", "edit-find",
]
first_button = None
for icon_name in icons:
if first_button is None:
button = Gtk.RadioToolButton()
first_button = button
else: button = Gtk.RadioToolButton.new_from_widget(first_button)
button.set_icon_name(icon_name)
self.toolbox.add(button)
if __name__ == "__main__":
win = ToolboxWindow()
Gtk.main()