2012-09-06 2 views
2

내 pygtk 프로그래밍에서 뭔가 빠졌지 만, 예를 들어 신호를 연결하고 싶습니다. gtk.Entry 그리고 내가 그렇게 할 수있을 때만 연결 신호를 내 보낸다. 이다수동으로 위젯 기능을 전환하여 pygtk에서 신호를 내 보냅니다.

, 나는 Hello 만 "허용"되는 신호 때 인쇄 그래서 (만 상호 작용 사용)이 최소한의 코드 toggle_signalling에 무언가를 추가 할 :

import gtk 

signal_states = ['On', 'Off'] 
signal_state = True 

def reporter_function(*args,**kwargs): 
    print "Hello" 

def toggle_signaling(widget, **kwargs): 
    global signal_state 
    signal_state = not signal_state 
    widget.set_label(signal_states[signal_state]) 
    print ['Emit allowed', 'Emit not allowed'][not signal_state] 

w = gtk.Window() 
e = gtk.Entry() 
b = gtk.Button(label=signal_states[signal_state]) 

hbox = gtk.HBox() 
hbox.pack_start(e) 
hbox.pack_end(b) 

e.connect("changed", reporter_function) 
b.connect("clicked", toggle_signaling) 
w.add(hbox) 
w.show_all() 

내가 이전에 존재하게했습니다 그러한 송신 신호 상태에 대한 불린 플래그 내 맞춤 widget-classes에 self._updating을 넣고, 무엇이든하기 전에 콜백 함수가이 상태를 체크하게하십시오. 그건 내가 원하는 것이 아니다.

예를 들어 버튼을 클릭했을 때 신호를 보내면 안된다는 것을 위젯에 알려주는 gtk-native 방식이 필요합니다. 나는이 일을 한 번 우연히 만났을 거라 확신하지만, 다시 찾는데 길을 잃어 버렸다.

또한 분명히하려면 위젯을 계속 사용하도록 설정해야합니다.

답변

3

나는 부울 플래그 주위에 방법이 있다고 생각하지 않습니다. Wether 위젯은 신호를 내보내거나 추가 응용 프로그램 논리가 없으므로 어딘가에 보관해야합니다.
토픽에 대한 이전 연구와 매우 잘 설명 된 기능을 기반으로 아마 chapter 20.1.2 of the PyGTK tutorial을 찾을 수 있습니다.
포괄적 인 예제 코드를 함께 사용합니다. 부울 표시기를 제외하고 유지해야 할 유일한 것은 연결된 신호의 handler_id입니다. 당신이 알 수 있듯이, 그것은 Gtk3 프로그래밍,하지만 중요한 방법 handler_blockhandler_unblock 기능 동일한 방법으로 모두은 Gtk 2, 3

from gi.repository import Gtk 

class TestWindow(Gtk.Window): 

    def __init__(self, *args, **kwargs): 
     Gtk.Window.__init__(self, *args, **kwargs) 
     self.connect("destroy", Gtk.main_quit) 
     self.is_allowed = True 
     self.create_widgets() 
     self.show_all() 

    def create_widgets(self): 
     box = Gtk.HBox() 
     self.entry = Gtk.Entry() 
     self.handler_id = self.entry.connect("changed", self.on_entry_changed) 
     box.pack_start(self.entry, True, True, 0) 
     button = Gtk.Button("Toggle") 
     button.connect("clicked", self.on_button_clicked) 
     box.pack_start(button, True, True, 0) 
     self.add(box) 

    def on_entry_changed(self, *args): 
     print "entry has changed" 

    def on_button_clicked(self, *args): 
     if self.is_allowed: 
      self.entry.handler_block(self.handler_id) 
      print "now blocking" 
     else: 
      self.entry.handler_unblock(self.handler_id) 
      print "now unblocking" 
     self.is_allowed = not self.is_allowed 

TestWindow() 
Gtk.main() 
+0

딱!이야 그것은 실제로 내가 찾고 있던'widget.handler_block'과'widget.handler_unblock'이었습니다. – deinonychusaur

관련 문제