Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt новый стиль назначения обработчика [RSS Feed]

#1 Апрель 14, 2014 08:43:31

Red_baron
Зарегистрирован: 2012-08-30
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

Добрый день!

Назначаю обработчик для кнопки:

self.button.clicked.connect(self.buttonClicked)

Объявлен метод обработчик:
def buttonClicked(self,  stroka = None):
...

Проблема, что в обработчик передается False, т.е. получается stroka = False, а хотелось бы, если я не передаю параметр, получить stroka = None.

При старом стиле все работает нормально:
self.connect(self.button, QtCore.SIGNAL('clicked()'), self.buttonClicked)

Офлайн

#2 Апрель 14, 2014 11:13:45

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

Red_baron
получается stroka = False, а хотелось бы, если я не передаю параметр, получить stroka = None
самому интересно
получилось так:
from PyQt4 import QtGui, QtCore
import sys
from functools import partial
class Widget(QtGui.QWidget):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.button = QtGui.QPushButton("Button", self)
        self.button.clicked.connect(partial(self.buttonClicked))      
    
    def buttonClicked(self, **arg):
        if arg:
            for key in arg:
                if key == 'stroka':
                    stroka = arg[key]
                else:
                    stroka = None
        else:
            stroka = None
        print stroka
app = QtGui.QApplication(sys.argv)
main = Widget()
main.show()
sys.exit(app.exec_())
это, если могут быть другие (другой) аргументы
а если известно что аргумент только один (stroka)
то вообще так:
    def buttonClicked(self, stroka=None):
        if not stroka:
            stroka = None
        print stroka
 
но что-то мне подсказывает, что есть Правильный способ…

Отредактировано vrabey (Апрель 14, 2014 11:17:08)

Офлайн

#3 Апрель 15, 2014 02:07:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

Red_baron
Проблема, что в обработчик передается False, т.е. получается stroka = False, а хотелось бы, если я не передаю параметр, получить stroka = None.

про какой параметр речь ?
это определённый аргумент, который туда всегда передаётся
если кнопка нажимаемая (можно нажать и она останется нажата), то он получает значение сигнала

#!/usr/bin/env python3
 
# по мотивам ZetCode PyQt4 tutorial
 
# отображает состояние нажатой кнопки
 
import sys
from PyQt4 import QtGui, QtCore
 
 
class Example(QtGui.QWidget):
 
    def __init__(self):
        super(Example, self).__init__()
 
        self.initUI()
 
    def initUI(self):
 
        self.button = QtGui.QPushButton('Test', self)
        self.button.setCheckable(True)
        self.button.clicked[bool].connect(self.buttonClicked)
 
        self.label = QtGui.QLabel(self)
 
        hbox = QtGui.QHBoxLayout()
        hbox.addWidget(self.button)
        hbox.addWidget(self.label)
 
        self.setLayout(hbox)
 
        self.setGeometry(300, 300, 280, 170)
        self.setWindowTitle('Button Signal')
        self.show()
 
    def buttonClicked(self, checked):
 
        arg = str(checked)
        name = self.sender().text()
 
        self.label.setText('{}, {}'.format(arg, name))
 
 
def main():
 
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 
 
if __name__ == '__main__':
    main()



Отредактировано py.user.next (Апрель 15, 2014 02:11:28)

Офлайн

#4 Апрель 15, 2014 06:34:25

Red_baron
Зарегистрирован: 2012-08-30
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

vrabey
если известно что аргумент только один (stroka)
то вообще так:
def buttonClicked(self, stroka=None):
if not stroka:
stroka = None
print stroka

но что-то мне подсказывает, что есть Правильный способ…
Спасибо, я соорудил похожую конструкцию.

py.user.next
про какой параметр речь ?
это определённый аргумент, который туда всегда передаётся
если кнопка нажимаемая (можно нажать и она останется нажата), то он получает значение сигнала

Вы не правы. При старом стиле ничего не передается.
Red_baron
При старом стиле все работает нормально:
self.connect(self.button, QtCore.SIGNAL('clicked()'), self.buttonClicked)

Отредактировано Red_baron (Апрель 15, 2014 06:34:54)

Офлайн

#5 Апрель 15, 2014 07:32:06

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

Red_baron
При старом стиле ничего не передается
self.connect(self.button, QtCore.SIGNAL(“clicked(bool)”), self.buttonClicked)
- передаётся

Офлайн

#6 Апрель 15, 2014 10:10:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

Red_baron
Вы не правы. При старом стиле ничего не передается.
там, походу, по разному можно его запускать
описание сигнала есть в документации

в старом стиле не передаётся, когда не передаёшь
TypeError: buttonClicked() missing 1 required positional argument: 'checked'
в новом стиле передаётся и тогда, когда не передаёшь (это больше соответствует описанию)

Red_baron
Проблема, что в обработчик передается False, т.е. получается stroka = False
а как она получается False, сама собой ?

вопрос, вообще, в том: нафига этот аргумент там



Отредактировано py.user.next (Апрель 15, 2014 10:11:42)

Офлайн

#7 Апрель 16, 2014 07:26:16

Red_baron
Зарегистрирован: 2012-08-30
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt новый стиль назначения обработчика

По идее эти назначения эквивалентны:

self.connect(self.button, QtCore.SIGNAL('clicked()'), self.buttonClicked)
...
self.button.clicked.connect(self.buttonClicked)

А на самом деле нет. Первый передает False, а второй нет.
Мой вопрос решается либо назначение старого стиля, либо как vrabey написал во #2 посте.

Офлайн

  • Начало
  • » GUI
  • » PyQt новый стиль назначения обработчика[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version