簡體   English   中英

如何在 Gtk TreeView 中實現拖放系統?

[英]How do I implement a drag and drop system in a Gtk TreeView?

我正在使用readthedocs教程自學 Python Gtk+3。 我目前正在進行拖放操作,並希望創建一個 TreeView ,其中每一行都是可拖動的。 為此,我的代碼讀取遠程命令列表並將它們放入 TreeView。 這個 TreeView 可以工作,我可以拖動單行。 但是,當我將它們放入指定的放置區域時,什么也沒有發生。

我目前的目標是讓程序在我丟東西時只打印文本“接收到的數據”。 稍后,我希望程序打印出已刪除的單個命令。

我的代碼如下所示(我按照這個例子):

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

from csv import reader

# get data from file and format it
with open ("TC_list.csv", "r") as read_command_list:
    csv_reader = reader(read_command_list)
    list_of_commands = list(csv_reader)
    list_header = list_of_commands.pop(0)

for command in list_of_commands:
    command[0] = int(command[0])
    command[1] = int(command[1])

DRAG_ACTION  = Gdk.DragAction.COPY


class DragDropWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Drag and Drop Demo")

        self.grid = Gtk.Grid()
        self.grid.set_column_homogeneous(True)
        self.grid.set_row_homogeneous(True)
        self.add(self.grid)
        self.grid.set_size_request(1200, 1000)

        self.listview = DragSourceListView()
        self.drop_area = DropArea()

        self.grid.attach(self.listview, 0, 0, 1, 1)
        self.grid.attach_next_to(self.drop_area, self.listview, \
            Gtk.PositionType.BOTTOM, 1, 1)


class DragSourceListView(Gtk.Grid):
    def __init__(self):
        Gtk.Grid.__init__(self)

        # Creating ListStore model
        self.telecommand_liststore = Gtk.ListStore(int, int, str, str)
        for telecommand_ref in list_of_commands:
            self.telecommand_liststore.append(list(telecommand_ref))
        self.current_filter_telecommand = None

        # Creating the filter, feeding it with the liststore model
        self.telecommand_filter = self.telecommand_liststore.filter_new()
        # setting the filter function
        self.telecommand_filter.set_visible_func(self.telecommand_filter_func)

        # creating the treeview, making it use the filter a model, adding columns
        self.treeview = Gtk.TreeView.new_with_model(Gtk.TreeModelSort(self.telecommand_filter))
        for i, column_title in enumerate(list_header):
            renderer = Gtk.CellRendererText()
            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
            column.set_sort_column_id(i)
            self.treeview.append_column(column)

        # set up drag-source
        self.treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, [], DRAG_ACTION)
        self.treeview.connect("drag-data-get", self.on_drag_data_get)

        # setting up layout, treeview in scrollwindow
        self.scrollable_treelist = Gtk.ScrolledWindow()
        self.scrollable_treelist.set_vexpand(True)
        self.scrollable_treelist.set_hexpand(True)
        self.attach(self.scrollable_treelist, 0, 1, 8, 10)

        self.scrollable_treelist.add(self.treeview)


    def telecommand_filter_func(self, model, iter, data):
        if (
            self.current_filter_telecommand is None
            or self.current_filter_telecommand == "None"
        ):
            return True
        else:
            return model[iter][0] == self.current_filter_telecommand


    def on_drag_data_get(self, widget, drag_context, dat, info, time):
        selected_tc = self.get_selected_items()[0]
        selected_iter = self.get_model().get_iter(selected_tc)



class DropArea(Gtk.Label):
    def __init__(self):
        Gtk.Label.__init__(self)
        self.set_label("Drop Area")
        self.drag_dest_set(Gtk.DestDefaults.ALL, [], DRAG_ACTION)

        self.connect("drag-data-received", self.on_drag_data_received)

    def on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
        print("Received data")



win = DragDropWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

我在這里俯瞰什么? 為什么放置區不做任何事情?

嘗試將gtk_tree_view_set_reorderableTrue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM