放弃点击QPushButton

时间:2014-05-15 07:53:38

标签: python qtgui qpushbutton

我使用Python中的QtGUI编写一个简单的GUI,允许用户通过单击按钮(button1)启动例程,10秒后应该可以选择单击另一个按钮(button2)来启动一些例程。我试过以下:

self.button1=QtGui.QPushButton('Button1',self)
self.button1.clicked.connect(self.button1clicked)

self.button2=QtGui.QPushButton('Button2',self)
self.button2.setEnabled(False)
self.button2.clicked.connect(self.button2clicked)

def button1clicked(self):
    self.button2.setEnabled(False)
    self.button2.clicked.disconnect()
    self.timeNow = time.time()
    self.enablebutton2()

def enablebutton2(self):
    while(True):
        if time.time() - self.timeNow > 10:
            self.button2.clicked.connect(self.button2clicked)
            self.button2.setEnabled(True)
            break

def button2clicked(self):
    someroutine()

它似乎工作,按钮在开始时被禁用,当我点击它没有任何反应但是然后我点击button1后10秒钟结束button2接收我之前做的所有点击。

这不应该发生,如何确保在禁用button2时丢弃所有这些点击?

2 个答案:

答案 0 :(得分:0)

您无需执行self.button2.clicked.disconnect(),因为您正在禁用button2。这本身就足够了。其次,您从enableButton2()的广告位调用button1这是错误的。你在while循环中阻塞主线程10秒钟。这是错误的做事方式。

相反,你应该使用QTimer设置时间10秒,然后从button1的插槽开始。在计时器的插槽中,您可以启用button2。请参阅QTimer here,以下是C ++示例,您可以轻松地在python中转换它

 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000);

答案 1 :(得分:0)

您还连接了button2两次...一次创建按钮并再次在enablebutton2中。只应使用第二个连接。这样甚至不需要断开声明。

同样如@Abhishek所述,您需要使用QTimer,因为您要阻止UI 10秒钟。 C ++代码看起来有点像

QPushButton *button1 = new QPushButton("Button1");
connect(button1, SIGNAL(clicked()), this, SLOT(button1clicked()));

QPushButton *button2 = new QPushButton("Button1");
button2->setEnabled(false);

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(enableButton2()));  

button1clicked()
{
    timer->start();
}

enableButton2()
{
    button2->setEnabled(true);
    connect(button2, SIGNAL(clicked()), this, SLOT(button2clicked()));
}

button2clicked()
{
    someroutine();
}