2014-04-05 12 views
3

glib.timeout_add()glib.source_remove()을 사용하여 한 번 클릭 이벤트를 두 번 클릭 이벤트에서 분리하려고합니다. 여기에 내가 그 일을하고 어떻게 :pygtk의 두 번 클릭 이벤트 및 단일 클릭 이벤트 처리

class Exchange: 

''' 

some code 

''' 

    def __init__(self): 

     self.timeoutID_1 = 0 
     self.timeoutID_2 = 0 

     self.startTime1 = 0.0 
     self.stopTime1 = 0.0 
     self.startTime2 = 0.0 
     self.stopTime2 = 0.0 

     ''' 

     some code 

     ''' 

     ## THE DOUBLE CLICK SIGNAL - item-activated 
     iconView1.connect("item-activated", self.on_item_activated_1,upButton1, store1) 
     sw1.add(iconView1) 

     iconView2.connect("item-activated", self.on_item_activated_2,upButton2, store2) 
     sw2.add(iconView2) 

     ## THE SINGLE CLICK SIGNAL - selection-changed 

     iconView1.connect("selection-changed", self.on_selection_changed_1, copyButton1, cutButton1, pasteButton1, deleteButton1) 
     iconView2.connect("selection-changed", self.on_selection_changed_2, copyButton2, cutButton2, pasteButton2, deleteButton2) 

    def on_selection_changed_1(self, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1) : 


     self.startTime1 = time.time() 

     self.timeoutID_1 = glib.timeout_add(2000, self.selectIcon_1, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1) 


    def on_selection_changed_2(self, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2) : 

     self.startTime2 = time.time() 

     self.timeoutID_2 = glib.timeout_add(2000, self.selectIcon_2, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2) 


    def selectIcon_1(self, iconView1, copyButton1, cutButton1, pasteButton1, deleteButton1) : 

     copyButton1.set_sensitive(True) 
     cutButton1.set_sensitive(True) 
     pasteButton1.set_sensitive(True) 
     deleteButton1.set_sensitive(True) 


    def selectIcon_2(self, iconView2, copyButton2, cutButton2, pasteButton2, deleteButton2) : 


     copyButton2.set_sensitive(True) 
     cutButton2.set_sensitive(True) 
     pasteButton2.set_sensitive(True) 
     deleteButton2.set_sensitive(True) 

    def on_item_activated_1(self, iconView1, item, upButton1, store1) : 

     self.stopTime1 = time.time() 

     if self.stopTime1 - self.startTime1 < 1.50 : 
      glib.source_remove(self.timeoutID_1) 

     ''' 

     some code 

     ''' 

    def on_item_activated_2(self, iconView2, item, upButton2, store2) : 

     self.stopTime2 = time.time() 

     if self.stopTime2 - self.startTime2 < 1.50 : 
      glib.source_remove(self.timeoutID_2) 

     ''' 

     some code 

     ''' 

(유효한 더블 클릭을 의미) 인 Trueself.stopTime - self.startTime <1.50에도 불구하고, 단 한번의 클릭 이벤트가 각각 단일 클릭에 대해, 2 초 후 단 한 번만 실행됩니다. 유효한 더블 클릭에 대해 selectIcon 메소드의 실행을 완전히 취소하려면 어떻게해야합니까?

UPDATE

는 mtwebster의 대답에 따라 나는 button_press_event을 사용했습니다. 슬프게도 나는 다시 정사각형으로 돌아 간다.

def on_button_press_event(self, widget, event) : 
    if event.button == 1 : 
     data = widget.get_path_at_pos(int(event.x), int(event.y)) 
     if data : 
      if event.type == gtk.gdk._2BUTTON_PRESS : 
       print " double click " 

      elif event.type == gtk.gdk.BUTTON_PRESS : 
       print " single click " 

OUTPUT ::

[email protected]:~/Documents/Project$ python draft6.py 
single click 
single click 
double click 

는 세 개의 클릭 이벤트가 두 번 클릭, 두 개의 단일 클릭과 더블 클릭에 대해 실행되는 내 불황에 추가! glib.timeout_add() 대신에 사용할 수있는 다른 타이밍 메커니즘이 있습니까? 반복 된 호출 넌센스의 불확실성을 해결할 필요가없는 곳이 있습니까?

+0

왜 신호에게 '자신을 모든' "버튼을 눌러/해제 이벤트를"처리할까요? 논리를 올바르게 얻는 것은 귀찮은 일입니다. 문서는 "item-activated"가 DOUBLE-CLICK이 활성화되어 있다고 (''on-single-click ''속성이'FALSE'와 다른 foo로 설정되어 있고''선택 변경 ' '는 일반적으로 한 번의 클릭으로 활성화됩니다 (또는 화살표 키를 누르십시오). 당신이 원하는 행동을 정교하게 만들 수 있습니까? – drahnr

+0

@drahnr 나는 이러한 메소드를 사용했지만 iconView의 모든 단일 클릭에 대해'selection-changed'도 트리거됩니다. 잘라 내기/복사/붙여 넣기/삭제 유틸리티를 사용하여 파일 브라우저를 구축 중입니다. 따라서 파일/폴더를 클릭 할 때마다 잘라 내기/복사 등을 선택할 수 있으며 폴더를 두 번 클릭하면 해당 폴더의 내용을 볼 수 있습니다. –

+1

그래도 문제는 표시되지 않습니다. ''item-activated ''를 열 /보기 폴더 재미를 위해 콜백과 함께 사용하고''selected-changed ''를 사용하여 선택을 강조 표시하는 것을 정확히 막을 수 있습니까? 'button-press/release-events'는 전혀 필요하지 않습니다. 이벤트는 암시 적으로 분리됩니다. 내가 놓친 게 있니? – drahnr

답변

0

실제로 유효한 대답은 아니 겠지만 ... IconView의 'on-button-press'신호에 연결하는 것으로 생각 해봤습니까?

이벤트 콜백에서 Gdk가 두 번 클릭 이벤트인지 또는 event-> type (https://developer.gnome.org/gdk3/stable/gdk3-Event-Structures.html#GdkEventButton 참조)을 선택하여 단일 클릭인지 결정할 수 있습니다.

+1

그런 다음 실제 답변으로 업그레이드하십시오. – Beryllium

+0

@mtwebster는 [참조 매뉴얼] (http://www.pygtk.org/pygtk2reference/class-gtkiconview.html)에서이 신호를 찾을 수 없습니다 ... 또한'item-activated'는 저에게 아이콘이 활성화되어 있고 현재 작업중인 파일 브라우저 프로젝트에 유용합니다. –

+0

하지만 현재 이벤트 콜백에서 제안한 gdk 부분을 사용할 수 있습니다. –

0

여기 처리기를 제거하는 것이 좋은 전략이라고 생각하지 않습니다.

한 번 클릭 (즉, 클릭하여 선택)에 다른 논리를 첨부하고 TreeView의 행을 두 번 클릭 (즉, 클릭하여 실행)하는 해킹을 한 번 해보았습니다. 또한 키보드 탐색 및 이미지를 지원할 수도 있습니다.

나는 그 때 작업 한 pygtk 버전에서 작동하도록했습니다. 그러나 나중에 약간의 gtk 릴리스와 코드가 끊어졌습니다. 동일한 코드로 gtk의 여러 버전을 지원하는 것은 불가능한 것으로 판명되었습니다.

가장 실용적인 방법은 두 항목을 추적 할 수 있었다 :

  • 가 이미 선택한 개체에 나오는 클릭입니다 (내 경우 행에)
  • 을 어떻게, 얼마나 오래 전에이 행
      을 선택했다 키보드에 의해 선정되었다
    • 행을 무시 - -
    • 행 (/ 스위칭보기를 표시 할 때 첫 번째 행) 기본적으로 선택되었다 (이 300ms를 말)
    • 행이 너무 오래 전에 선택한 무시 -
    • 다른
    • 가 (이하이 300ms보다, 클릭으로 선택) 무시 -
0

당신은 더블 클릭의 기간 이후에 일어날 수있는 단 한번의 클릭 이벤트를 예약 할 수있는 실행 후 더블 클릭이 발생하는 경우, 핸들러가 실행되기 전에 예약 된 단일 클릭 이벤트를 제거하십시오.예를 들면 :

import pygtk 
pygtk.require('2.0') 
import gtk 
import glib 
class Test: 
    def __init__(self): 
     # Create a new window 
     self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     self.window.set_title("Test") 

     # It's a good idea to do this for all windows. 
     self.window.connect("destroy", lambda wid: gtk.main_quit()) 
     self.window.connect("delete_event", lambda a1,a2:gtk.main_quit()) 

     # Sets the border width of the window. 
     self.window.set_border_width(20) 

     # Create a new button 
     button = gtk.Button("Click") 
     self.click_events = [] 

     # Connect the "clicked" signal of the button to our callback 
     button.connect("button-press-event", self.on_button_press_event) 
     button.show() 

     self.window.add(button) 
     self.window.show() 

    def on_button_press_event(self, widget, event): 
     if event.button == 1: 
      if event.type == gtk.gdk._2BUTTON_PRESS: 
       # Remove all single click events 
       while self.click_events: 
        glib.source_remove(self.click_events.pop()) 
       glib.idle_add(self.handle_double_click,widget,event) 
      elif event.type == gtk.gdk.BUTTON_PRESS: 
       # Schedule after double click can occur 
       self.click_events.append(glib.timeout_add(300,self.handle_single_click,widget,event)) 


    def handle_single_click(self,widget,event): 
     # TODO: Handle single click 
     print "TODO: Handle single click" 


    def handle_double_click(self,widget,event): 
     # TODO: Handle double click 
     print "TODO: Handle double click" 

def main(): 
    Test() 
    gtk.main() 
    return 0  

if __name__ == "__main__": 
    main() 
관련 문제