PyGObject:使用ToolPalette拖放

时间:2019-02-21 02:51:45

标签: python drag-and-drop gtk gtk3 pygobject

我已经能够从Gtk.ToolPalette进行拖放工作,但是仅当设置public Dictionary<String, int> processData(IEnumerable<string> lines) { List<EmployeeSalary> list = new List<EmployeeSalary>(); foreach(var line in lines) { string[] temp = line.Split(','); EmployeeSalary tempObj = new EmployeeSalary(); tempObj.EmployeeID = int.Parse(temp[0]); tempObj.Name = temp[1]; tempObj.Department = temp[2]; tempObj.Salary = int.Parse(temp[3]); list.Add(tempObj); } var query = (from f in list group f by f.Department into g select g); Dictionary<String, int> retVal = query.ToDictionary(x => x.Key, x => x.OrderByDescending(c=>c.Salary).Select(c=>c.EmployeeID).FirstOrDefault()); return retVal; } 时才可以。但是,在单击工具按钮以将其拖放时,并不会导致在视觉上实际单击该按钮。我了解这是因为Gtk.ToolButton.set_use_drag_window(True)导致所有事件(甚至是按钮单击)都被作为拖动事件拦截了。

文档说,与Gtk.ToolPalette一起使用拖放的最简单方法是使用所需的拖动源面板和所需的拖动目标小部件来调用set_use_drag_window。基于GUI应用程序的复杂性,这与我所需要的相反,因为我需要先设置ToolPalette,然后在创建DrawingArea之后向拖动源添加回调。

我从Gtk.ToolPalette.add_drag_dest()继承过来,为调色板的每个部分创建了一个Gtk.TooPalette,然后创建按钮:

Gtk.ToolItemGroup

然后在DrawingArea上将其设为拖动目标:

def toolbox_button(self, action_name, stock_id):
    button = Gtk.ToolButton.new_from_stock(stock_id)
    button.action_name = action_name
    button.set_use_drag_window(True)

    # Enable Drag and Drop
    button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    button.drag_source_set_icon_stock(stock_id)
    button.connect("drag-data-get", self._button_drag_data_get)

    return button

是否可以通过拖放操作来使用ToolPalette,同时仍允许按钮正常工作?

1 个答案:

答案 0 :(得分:0)

我的贡献者同伙研究了GTK源代码,发现Gtk.ToggleToolButton实际上有一个当前未记录的子按钮。如果将拖动源设置为此“内部按钮”,则拖放有效。

def toolbox_button(action_name, stock_id, label, shortcut):
    button = Gtk.ToggleToolButton.new()
    button.set_icon_name(stock_id)
    button.action_name = action_name
    if label:
        button.set_tooltip_text("%s (%s)" % (label, shortcut))

    # Enable Drag and Drop
    inner_button = button.get_children()[0]
    inner_button.drag_source_set(
        Gdk.ModifierType.BUTTON1_MASK | Gdk.ModifierType.BUTTON3_MASK,
        self.DND_TARGETS,
        Gdk.DragAction.COPY | Gdk.DragAction.LINK,
    )
    inner_button.drag_source_set_icon_stock(stock_id)
    inner_button.connect(
        "drag-data-get", self._button_drag_data_get, action_name
    )

    return button