2014-03-30 68 views
0

我有一個項目需要我有一個數據列表,你應該只能選擇列表中的兩個項目。 我對python和Gtk非常陌生,但是我的搜索對於如何做到這一點的答案一直徒然。所以,代碼。 如何編寫一個Gtk.TreeSelection.set_select_function()

#!/usr/bin/python3 

from gi.repository import Gtk 

class Window(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="MyWindow") 

     self.set_default_size(200, 200) 

     self.liststore = Gtk.ListStore(str, str) 
     for i in range(1,10): 
      row = "Row"+ str(i) 
      value = "Value"+str(i) 
      self.liststore.append([row, value]) 


     treeview = Gtk.TreeView(model=self.liststore) 

     renderer_text = Gtk.CellRendererText() 
     column = Gtk.TreeViewColumn("Col1", renderer_text, text=0) 
     treeview.append_column(column) 

     column = Gtk.TreeViewColumn("Col2", renderer_text, text=1) 
     treeview.append_column(column) 

     treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 
     #treeview.get_selection().set_select_function() <-- How do you write one of these? 

     self.add(treeview) 

win = Window() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

很顯然,因爲我想限制選項數量,Gtk.SelectionMode.MULTIPLE將無法正常工作。但是我發現你可以用set_select_function()指定你自己的選擇模式。然而,我卻沒有找到任何寫這些的例子,或者他們需要包含什麼。我已經在Java中爲JList編寫了相同類型的函數(在Java中啓動項目,但由於語言[掃描WiFi]的限制,必須切換語言),如果出於某種原因需要,我可以發佈該代碼。

所以,我的問題是這樣的:你如何實際爲python中的TreeSelection編寫一個選擇函數?我正在使用Python 3和Gtk3。

獎金問題:如何編寫它,以便限制選擇的數量?

回答

1

有點晚,但比從不好。 .set_select_function()在這種情況下需要一個函數名稱作爲參數。如果該行可以切換,則該函數返回True,否則返回False。您還必須將TreeSelection模式保留爲Gtk.SelectionMode.MULTIPLE。

#!/usr/bin/python3 

from gi.repository import Gtk 

class Window(Gtk.Window): 

def __init__(self): 
    Gtk.Window.__init__(self, title="MyWindow") 

    self.set_default_size(200, 200) 

    self.liststore = Gtk.ListStore(str, str) 
    for i in range(1,10): 
     row = "Row"+ str(i) 
     value = "Value"+str(i) 
     self.liststore.append([row, value]) 


    treeview = Gtk.TreeView(model=self.liststore) 

    renderer_text = Gtk.CellRendererText() 
    column = Gtk.TreeViewColumn("Col1", renderer_text, text=0) 
    treeview.append_column(column) 

    column = Gtk.TreeViewColumn("Col2", renderer_text, text=1) 
    treeview.append_column(column) 

    treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) 
    treeview.get_selection().set_select_function(self.select_function) 

    self.add(treeview) 

def select_function(self, treeselection, model, path, current): 
    state = True 

    if treeselection.count_selected_rows() < 2: 
     state = True 
    else: 
     if treeselection.path_is_selected(path): 
      state = True 
     else: 
      state = False 

    return state 

win = Window() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

做上述可能不是用戶最發現方式的替代可能是使用CellRendererToggle部件有兩個以上的選擇會拋出一個錯誤或者根本不允許用戶繼續。

+0

對不起,但我不明白這應該如何使用。所需參數映射到什麼地方? – Chewtoy

+0

我已經修改了我的帖子以獲得工作示例。當選擇改變時,GTK +會自行填充這些參數。 .set_select_function()只是指定要求的功能名稱(即只允許選擇兩行)。 –

+0

謝謝!這就是訣竅!還有一個問題。這可確保只能選擇兩個值,但您必須按住Ctrl才能進行第二次選擇。如何在不需要按Ctrl的情況下進行選擇? – Chewtoy