2010-08-20 2 views
3

주어진 열에 CellRendererCombo가있는 트리 뷰가 있습니다.gtk : CellRendererCombo 'changed'신호의 TreeView 모델을 수정하는 중 문제가 발생했습니다.

crc = gtk.CellRendererCombo() 
crc.set_property('model', comboModel) 
crc.set_property('text-column', 0) 
crc.set_property('editable', True) 
crc.set_property('has_entry', False) 
cl = gtk.TreeViewColumn(ctitle, crc, text=i) 

def changed(cell, path, newiter): 
    treeViewModel[path][0] = "HAH" 
crc.connect("changed", changed) 

treeView.append_column(cl) 

treeViewtreeViewModel은 모델이며, comboModel는 두 개의 문자열을 포함하는 콤보 항목의 모델로하는 TreeView이다 : 나는 열을 설정하려면 다음 코드를 사용합니다.

내가 코드를 실행하면 예상대로 다음 콤보 내가 항목을 선택 처음 것을 제외하고, 작동 나는 다음과 같은 오류를 얻을 : 두 번째 시간에

c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: inva 
lid unclassed pointer in cast to `GObject' 
    gtk.main() 
c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: g_ob 
ject_notify: assertion `G_IS_OBJECT (object)' failed 
    gtk.main() 

를 내가 얻을 :

c:\python25\lib\site-packages\twisted\internet\gtk2reactor.py:255: Warning: inva 
lid uninstantiatable type `<invalid>' in cast to `GObject' 
    gtk.main() 

세 번째로 프로그램이 충돌합니다. 연결선을 다음과 같이 변경하면

crc.connect("edited", changed) 

... 코드가 올바르게 작동합니다. 그러나 값은 콤보 상자를 클릭 한 후에 만 ​​변경되며 객체를 선택할 때마다 값이 변경됩니다. 후자를 어떻게 할 수 있습니까?

편집 : 난 그냥 API docs for pygtk이 나타났습니다 : 즉시 트리보기에 표시되는 모델을 변경하면, 트리보기 바로 편집이 작동을 중단 할 것을

참고. 즉, 콤보 셀 렌더러가 편집 된 신호 또는 편집 된 신호를 내보낼 때까지 모델을 변경하지 않는 것이 좋습니다.

코드가 충돌한다는 것은 언급하지 않았습니다. 어떤 경우에는 콤보 박스의 항목을 클릭 한 후 ENTER를 누르거나 다른 곳을 클릭하지 않고 편집을 중단하고 싶습니다. 어떻게해야합니까?

답변

0

잘 모르겠지만 대답을 얻는 가장 빠른 방법은 pygtk 메일 링리스트를 검색하는 것입니다. 비슷한 게시물을 찾을 수 없다면 메일 링리스트에 게시 해보십시오. 항목이 선택 직후 CellRendererCombo 편집 종료

pygtk mailing list

1

는 2 단계 프로세스이다.

첫 번째 단계에서는 나중에 액세스 할 수 없으므로 콤보 자체를 캡처해야합니다. 콤보를 캡처하려면 editing-started CellRenderer 신호에 연결하십시오. Glade에서 연결을 정의하거나 코드에서 수동으로 만들 수 있습니다.

두 번째 단계에서 CellRendererCombo의 changed 신호 처리기에서 focus-out-event을 내 보냅니다. GTK +의 최신 버전, 당신은 통상 changed 신호 처리기에서하는 TreeModel를 수정하지 않는 것이

comboEditable = None 

crc = gtk.CellRendererCombo() 
crc.set_property('model', comboModel) 
crc.set_property('text-column', 0) 
crc.set_property('editable', True) 
crc.set_property('has_entry', False) 
cl = gtk.TreeViewColumn(ctitle, crc, text=i) 

def changed(cell, path, newiter): 
    treeViewModel[path][0] = "HAH" 
    e = gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE) 
    e.window = treeView.window 
    e.send_event = True 
    e.in_ = False 
    comboEditable.emit('focus-out-event', e) 
def started(cell, editable, path): 
    # Or to make life more predictable, use a class and set self.comboEditable 
    global comboEditable 
    comboEditable = editable 
crc.connect('changed', changed) 
crc.connect('editing-started', started) 

treeView.append_column(cl) 

참고 :

는 여기에 설명하도록 수정 원래의 코드입니다. edited 신호 처리기를 사용해야합니다.

comboEditable = None 

crc = gtk.CellRendererCombo() 
crc.set_property('model', comboModel) 
crc.set_property('text-column', 0) 
crc.set_property('editable', True) 
crc.set_property('has_entry', False) 
cl = gtk.TreeViewColumn(ctitle, crc, text=i) 

def changed(cell, path, newiter): 
    e = gtk.gdk.Event(gtk.gdk.FOCUS_CHANGE) 
    e.window = treeView.window 
    e.send_event = True 
    e.in_ = False 
    comboEditable.emit('focus-out-event', e) 
def started(cell, editable, path): 
    # Or to make life more predictable, use a class and set self.comboEditable 
    global comboEditable 
    comboEditable = editable 
def edited(cell, path, newtext): 
    treeViewModel[path][columnNumber] = newText 
crc.connect('changed', changed) 
crc.connect('editing-started', started) 
crc.connect('edited', edited) 

treeView.append_column(cl) 
: 여기

최종 버전입니다
관련 문제