Отправка информации в виде дерева из button_press_event в pygtk - PullRequest
1 голос
/ 17 апреля 2011

Я пишу приложение pygtk, которое использует древовидную структуру, которая имеет связь с button_press_event.Что я не могу понять, так это как передать информацию о древовидном представлении (в частности, по какой строке щелкнули) в gtk.Menu или в другой метод.Если я использовал сигнал row-activated, он передает информацию о строках и столбцах в качестве аргумента, но этого не происходит с button_press_event.Вот код, о котором идет речь:

    self.liststore = gtk.ListStore(str,int, int, int,str, 'gboolean')
    self.treeview = gtk.TreeView(self.liststore)

    self.treeview.connect("button_press_event",self.serverListEvent)
    self.treeview.set_search_column(0)
    self.draw_columns(self.treeview)

    self.blackmenu = gtk.Menu()
    self.bitem = gtk.MenuItem("Blacklist server")
    self.blackmenu.append(self.bitem)
    self.bitem.connect("activate",self.blacklistServer)
    self.bitem.show()

def serverListEvent(self,treeview,event):
    x = int(event.x)
    y = int(event.y)
    time = event.time
    model = treeview.get_model()

    pthinfo = treeview.get_path_at_pos(x, y)
    if pthinfo is not None:
        path, col, cellx, celly = pthinfo
        # Error here for the model with the column
        print 'url clicked '+model[col][0]
        treeview.grab_focus()
        treeview.set_cursor( path, col, 0)
        # Popup blacklist menu on right click
        if event.button == 3:            
            self.blackmenu.popup( None, None, None, event.button, time)
        # Join game on double click
        elif event.type == gtk.gdk._2BUTTON_PRESS:
            self.joinGame(treeview,model[col][0])
    return True

Затем мне нужно передать информацию из строки, по которой щелкнули, в методы self.joinGame и self.blacklistServer, но я тоже не знаю, как это сделать.

1 Ответ

2 голосов
/ 17 апреля 2011

Я помню, что этот был немного хитрым. Я установил gtk.TreeSelection моего дерева в любой режим выбора . Тогда это:

def get_selected_ids(self):
    ids = []
    store, paths = self.get_selection().get_selected_rows()

    # self.adapter is a mapping class from my data-model to a model column index.
    # If you know the column index from your gtk.ListStore, you don't need it.
    colindex = self.adapter.get_column_modelindex("id")

    for path in paths:
        treeiter = store.get_iter(path)
        # Pull value from liststore
        val = store.get_value(
            treeiter, 
            colindex
        )
        ids.append(val)
    return ids

Edit:

Я никогда не использовал gtk.Menu и gtk.MenuItem, поэтому я не понял, что ваше меню уже подключено к обратному вызову ( blacklistServer ). Это не проверено, но должно дать вам представление.

def blacklistServer(self, menuitem, *ignore):
    # you have to modify *get_selected_ids* so it returns the values you need for
    # blacklisting.
    values = self.get_selected_ids()
    blacklist = set(values)
    self.saveBlacklist(blacklist)
...