Отхвърлянето на QPushButton е щракнато

Програмирам прост GUI с QtGUI в Python, който позволява на потребителите да стартират рутина, като щракнат върху бутон (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 получава всички кликвания, които направих преди.

Това не трябва да се случва, как мога да се уверя, че всички тези кликвания се отхвърлят, когато бутон 2 е деактивиран?


person Daniel    schedule 15.05.2014    source източник


Отговори (2)


Не е необходимо да правите self.button2.clicked.disconnect(), тъй като деактивирате бутон2. Това само по себе си е достатъчно. Второ, когато се обаждате на enableButton2() от слот на button1, това е грешно. Вие блокирате основната нишка за 10 секунди във вашия цикъл while. Това е грешен начин за правене на нещата.

Вместо това трябва да използвате зададено от QTimer време за 10 секунди и да го стартирате от слота на button1. В слота на таймера можете да активирате бутон 2. вижте QTimer тук, Следва пример за C++, можете лесно да го конвертирате в python

 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(update()));
 timer->start(1000);
person Abhishek Bansal    schedule 15.05.2014

Вие също така свързвате button2 два пъти ... Веднъж, когато създавате бутона и отново в enablebutton2. Трябва да се използва само второто свързване. По този начин дори операторът за прекъсване на връзката не е необходим.

Също така, както е посочено от @Abhishek, трябва да използвате QTimer, тъй като блокирате потребителския интерфейс за 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();
}
person Pratham    schedule 15.05.2014
comment
Това всъщност направих, но свързах бутон2 преди, защото всеки път, когато щракна върху бутон1, искам бутон2 да бъде активиран за 10 секунди. Иначе в Python е същото. - person Daniel; 15.05.2014