Уведомления

Группа в Telegram: @pythonsu

#1 Май 19, 2010 21:06:22

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

вызов функции с параметром

ребята, я догадываюсь, что я чего-то где- то недочитал, но у меня горят сроки!
Кто-нибудь может вкратце рассказать, как повесить на кнопку вызов функции с параметром в PyQt?


(вкратце суть проблемы: у меня динамически создаются кнопочки, при нажатии на эти кнопочки отображается графический объект, а так же создается экземпляр класса, закрепленного за этой кнопочкой. Так вот, при нажатии на кнопку, должна вызываться функция с параметром, а параметром является этот класс, от которого нужно создать экземпляр)

целиком весь код, если что. Тык



Отредактировано (Май 20, 2010 11:56:13)

Офлайн

#2 Май 19, 2010 23:12:07

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

вызов функции с параметром

как-то так

button1.clicked.connect(lambda val=12345: self.testfunc(val))
button2.clicked.connect(lambda val=54321: self.testfunc(val))



Офлайн

#3 Май 19, 2010 23:18:36

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

вызов функции с параметром

прикольно с лямбдой придумано :)



Офлайн

#4 Май 20, 2010 09:41:58

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

вызов функции с параметром

for key, value in block_dict.items():
...
button = QtGui.QPushButton()
button.setIcon(QtGui.QIcon(value.image))
button.setIconSize(QtCore.QSize(30, 30))
button.setStatusTip(value.doc)

button.clicked.connect(lambda : self.add_block(value))
При клике на кнопку вызывается add_block(value), но не с нужным value, а ВСЕГДА с последним из цикла, который прошел по словарю. ЧЯДНТ?!



Офлайн

#5 Май 20, 2010 09:45:44

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

вызов функции с параметром

я не зря написал "lambda val=54321: self.testfunc(val)"



Офлайн

#6 Май 20, 2010 10:10:53

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

вызов функции с параметром

то есть val должен быть жестко задан или что? Просто в таком случае, value вообще не присваивается
вот весь код

for key, value in block_dict.items():
...
button.clicked.connect(lambda val = value: self.add_block(val))
...
def add_block(self, BlockClass):
item = IBlock(QtGui.QPixmap(BlockClass.image), None, self.scene)
...


Traceback (most recent call last):
File "forms/MainForm.py", line 175, in <lambda>
button.clicked.connect(lambda val = value: self.add_block(val))
File "forms/MainForm.py", line 184, in add_block
item = IBlock(QtGui.QPixmap(BlockClass.image), None, self.scene)
AttributeError: 'bool' object has no attribute 'image'
'bool' object has no attribute ‘image’, это он как раз про переданный параметр val, который был классом, а стал почему-то bool'ом



Отредактировано (Май 20, 2010 10:13:32)

Офлайн

#7 Май 20, 2010 10:27:41

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

вызов функции с параметром

Бррр. Кроме как влепить assert на проверку типа value перед button.clicked.connect идей нет.



Офлайн

#8 Май 20, 2010 11:38:44

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

вызов функции с параметром

да я делал все ок, value вообще меняется тока 1н раз в начале цикла, а при клике на кнопку берется какое-то непонятное значение. Тут Qt чего-то мутит воду, нужен кто-то кто хорошо знает его тонкости :)

целиком весь код, если что. Тык



Отредактировано (Май 20, 2010 11:54:09)

Офлайн

#9 Май 20, 2010 12:06:36

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

вызов функции с параметром

Смотрел исходник. Почему-то не нашел вызов set_blocks.



Офлайн

#10 Май 20, 2010 12:08:39

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

вызов функции с параметром

он в другом модуле потому что :)
http://bitbucket.org/zubchick/madmodeller/src/77971723ddca/madmodeller.py



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version