在PyQt中阻止按钮点击信号

问题描述:

我有一个程序使用pyqt的.animateClick()功能向用户显示用户必须按特定顺序复制的不同按钮点击顺序。问题是我不想让animateClick()发送一个信号,我只想要按钮点击来自用户的信号。下面是我的一些代码来演示我的意思,以及我如何解决这个问题(这不起作用)。我简化了我的代码,所以它更易于阅读,如果您有任何问题,请告诉我。在PyQt中阻止按钮点击信号

from PyQt4 import QtCore,QtGui 
global flag 
global ai_states 
ai_states = [] 
user_states = [] 


class Program(object): 
    # Set up the push buttons 
    #Code Here. 

    # Connect push buttons to function get_state() 
    self.pushButton.clicked.connect(self.get_state) 
    self.pushButton_2.clicked.connect(self.get_state) 
    self.pushButton_3.clicked.connect(self.get_state)   
    self.pushButton_4.clicked.connect(self.get_state) 

    # Code that starts the start() function 

    def start(self): 
     flag = 0 
     ai_states[:] = [] 
     i = -1 
     # Code here that generates ai_states, numbers 1-4, in any order, based on button numbers. 

     for k in ai_states: 
      i = i + 1 
      # Code here that animates button clicks determined by ai_states 

      # Changes the flag to 1 once the loop ends 
      if i == len(ai_states): 
       flag = 1 

    def get_state(self): 
     if flag == 1: 
      user_states.append(str(self.centralWidget.sender().text())) 
     else: 
      pass 

     if len(user_states) == len(ai_states): 
      # Checks to make sure the user inputted the same clicks as the ai_states 

即使该标志在start()函数后出现1,它仍会附加animatedClick()信号。我究竟做错了什么?我是GUI编程的新手,所以我可能会以非常糟糕的方式解决这个问题。任何帮助,将不胜感激。

永远不要使用全局变量,除非你真的必须这样做。如果您需要共享访问变量,请使用实例属性:

from PyQt4 import QtCore,QtGui 

class Program(object): 
    def __init__(self): 
     self.ai_states = [] 
     self.user_states = [] 
     self.flag = 1 

     # Set up the push buttons 
     # Code Here 

     # Connect push buttons to function get_state() 
     self.pushButton.clicked.connect(self.get_state) 
     self.pushButton_2.clicked.connect(self.get_state) 
     self.pushButton_3.clicked.connect(self.get_state)   
     self.pushButton_4.clicked.connect(self.get_state) 

    # Code that starts the start() function 

    def start(self): 
     self.flag = 0 
     del self.ai_states[:] 
     i = -1 
     # Code here that generates ai_states, numbers 1-4, in any order, based on button numbers. 

     for k in self.ai_states: 
      i = i + 1 
      # Code here that animates button clicks determined by ai_states 

     # Changes the flag to 1 once the loop ends 
     self.flag = 1 

    def get_state(self): 
     if self.flag == 1: 
      self.user_states.append(str(self.centralWidget.sender().text())) 

     if len(self.user_states) == len(self.ai_states): 
      # Checks to make sure the user inputted the same clicks as the ai_states