从pygtk中的button_press_event发送树视图信息

发布于 2024-11-02 01:08:17 字数 1521 浏览 0 评论 0原文

我正在编写一个使用树视图的 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 方法,但不知道如何也可以这样做。

I am writing an pygtk app that uses a treeview, which has a connection to button_press_event. What I can't figure out is how to pass the information about the treeview (specifically which row is clicked) to a gtk.Menu or another method. If I used the row-activated signal, it passes in the row and column information in as an argument, but this does not happen with button_press_event. Here is the code in question:

    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

I then need to pass the information from the clicked row to the self.joinGame and self.blacklistServer methods, but don't know how to do this either.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伏妖词 2024-11-09 01:08:17

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

I remember that one being kindy tricky. I set up my treeview's gtk.TreeSelection to whatever mode of selection preferred. Then this:

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:

I never used gtk.Menu and gtk.MenuItem, so I didn't get that you already had your menu connected to a callback (blacklistServer). This is untested, but should give you an idea.

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文