Простой набор инструментов в Gtk - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы создать простой набор инструментов в 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()
...