Frage

Writing a cut/copy/paste feature for a simple filebrowser in gtk. Every cut/copy button/paste click emits a progressively higher number of signals . Here is the part of the program that deals with the cut/copy/paste functionality of the browser :

def __init__(self):
    '''
    some code
    '''

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

def on_selection_changed_1(self, iconView1, copyButton1, copyButton2, cutButton1, cutButton2, pasteButton1, pasteButton2, deleteButton1, store1, store2) :

    selectedIcon = iconView1.get_selected_items()
    if selectedIcon :

        model = iconView1.get_model()
        path = model[selectedIcon[0]][COL_PATH]

        self.action_directory_1 = self.current_directory_1+os.path.sep+path

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

        copyButton1.connect("clicked",self.copy_pressed, cutButton1, cutButton2, pasteButton1, pasteButton2, 1, store1, store2)
        cutButton1.connect("clicked",self.cut_pressed, copyButton1, copyButton2, pasteButton1, pasteButton2, 1, store1, store2)
        deleteButton1.connect("clicked",self.delete_pressed, 1, store1, store2)


    else :

        copyButton1.set_sensitive(False)
        cutButton1.set_sensitive(False)
        deleteButton1.set_sensitive(False)


def on_selection_changed_2(self, iconView2, copyButton1, copyButton2, cutButton1, cutButton2, pasteButton1, pasteButton2, deleteButton2, store1, store2) :

    selectedIcon = iconView2.get_selected_items()
    if selectedIcon :


        model = iconView2.get_model()
        path = model[selectedIcon[0]][COL_PATH]
        self.action_directory_2 = self.current_directory_2+os.path.sep+path

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

        copyButton2.connect("clicked",self.copy_pressed, cutButton1, cutButton2, pasteButton1, pasteButton2, 2, store1, store2)            
        cutButton2.connect("clicked",self.cut_pressed, copyButton1, copyButton2, pasteButton1, pasteButton2, 2, store1, store2)
        deleteButton2.connect("clicked",self.delete_pressed, 2, store1, store2)



    else :

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

###############ACTION METHODS--CUT#################

def cut_pressed(self, widget, copyButton1, copyButton2, pasteButton1, pasteButton2, index, store1, store2):
    if index == 1:
        pasteButton2.set_sensitive(True)
        pasteButton2.connect("clicked", self.paste_pressed,"cut", 1, store1, store2)
        print " CUT BUTTON 1"
        print " ########################## "
        copyButton1.set_sensitive(False)
        widget.set_sensitive(False)

    else :
        pasteButton1.set_sensitive(True)
        pasteButton1.connect("clicked", self.paste_pressed,"cut", 2, store1, store2)
        print " CUT BUTTON 2"
        copyButton2.set_sensitive(False)
        widget.set_sensitive(False)

###############ACTION METHODS--COPY##################
def copy_pressed(self, widget, cutButton1, cutButton2, pasteButton1, pasteButton2, index, store1, store2):
    if index == 1:
        pasteButton2.set_sensitive(True)
        pasteButton2.connect("clicked", self.paste_pressed,"copy", 1, store1, store2)
        print " COPY BUTTON 1"
        cutButton1.set_sensitive(False)
        widget.set_sensitive(False)

    else :
        pasteButton1.set_sensitive(True)
        pasteButton1.connect("clicked", self.paste_pressed,"copy", 2, store1, store2)
        print " COPY BUTTON 2"
        cutButton2.set_sensitive(False)
        widget.set_sensitive(False)

##############ACTION METHODS--PASTE################

def paste_pressed(self, widget, action, index, store1, store2):
    if index == 1:
        if action == "cut" :
           print " cut selected 1" + " ACTION DIRECTORY : " +self.action_directory_1
           print " ########################## "

           widget.set_sensitive(False)


        else :
           print " copy selected 1" + " ACTION DIRECTORY : " +self.action_directory_1
           print " ########################## "
           widget.set_sensitive(False)

    else :
        if action == "cut" :
           print " cut selected 2" + " ACTION DIRECTORY : " +self.action_directory_1
           print " ########################## "
           widget.set_sensitive(False)

        else :
           print " copy selected 2" + " ACTION DIRECTORY : " +self.action_directory_1
           print " ########################## "
           widget.set_sensitive(False)

Here is the output received in the terminal :

vineet@vineet:~/Documents/Project$ python draft7.py

 CUT BUTTON 1 // FIRST CLICK
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/EFI
 ########################## 
 CUT BUTTON 1 // SECOND CLICK
 ########################## 
 CUT BUTTON 1
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/Media_File
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/Media_File
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/Media_File
 ########################## 
 COPY BUTTON 1  // THIRD CLICK
 COPY BUTTON 1
 COPY BUTTON 1
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 
 cut selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 
 copy selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 
 copy selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 
 copy selected 1 ACTION DIRECTORY : /media/vineet/MYLINUXLIVE/pics
 ########################## 

As you can see in the terminal output each click after the first click emits an increasing no. of outputs than the one before.How do I obtain 1 emit signal per click ?( or in this case one CUT/COPY BUTTON 1/2' and an associatedcut/copy selected 1/2` print output per click)

War es hilfreich?

Lösung

You keep connecting new signal handlers on every key press and never remove the old handlers. Every handler you connect will be called when the signal fires.

You should either connect all the signals only once in some initialization code (and then decide in the handler if it's a good time to actually handle the signal if you have cases where you don't want it handled), or you should disconnect the handler in the handler itself if you no longer want it to be called.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top