1

我正在编写一个使用树视图的 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.joinGameandself.blacklistServer方法,但也不知道该怎么做。

4

1 回答 1

2

我记得那个有点棘手。我将树视图的 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

编辑:

我从未使用过 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)
于 2011-04-17T08:07:36.293 回答