【问题标题】:Multiple button clicked signals emitted for a single click一次单击发出的多个按钮单击信号
【发布时间】:2014-04-09 08:23:51
【问题描述】:

在 gtk 中为一个简单的文件浏览器编写剪切/复制/粘贴功能。每次剪切/复制按钮/粘贴点击都会发出越来越多的信号。以下是处理浏览器剪切/复制/粘贴功能的程序部分:

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)

这是终端收到的输出:

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
 ########################## 

正如您在终端输出中看到的那样,第一次点击后的每次点击都会发出一个递增的数字。输出比以前的多。如何每次点击获得 1 个发射信号?(或者在这种情况下,一个 CUT/COPY BUTTON 1/2' and an associatedcut/copy 选择 1/2` 每次点击打印输出)

【问题讨论】:

  • 您在每次按键时都不断连接新的信号处理程序,并且永远不会删除旧的处理程序。当信号触发时,您连接的每个处理程序都会被调用。
  • @jku 回答?请:)
  • @jku 是的,这就是问题所在......我自己意识到了......将其添加为答案
  • 好的,添加了一个答案:)

标签: python gtk signals


【解决方案1】:

您在每次按键时都会连接新的信号处理程序,并且永远不会删除旧的处理程序。当信号触发时,您连接的每个处理程序都会被调用。

您应该在某些初始化代码中仅将所有信号连接一次(然后在处理程序中决定如果您有不希望处理信号的情况是否是实际处理信号的好时机),或者您应该如果您不再希望调用它,请断开处理程序本身中的处理程序。

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多