Найти - Пользователи
Полная версия: PyQt новый стиль назначения обработчика
Начало » GUI » PyQt новый стиль назначения обработчика
1
Red_baron
Добрый день!

Назначаю обработчик для кнопки:
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)
vrabey
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
 
но что-то мне подсказывает, что есть Правильный способ…
py.user.next
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()
Red_baron
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)
vrabey
Red_baron
При старом стиле ничего не передается
self.connect(self.button, QtCore.SIGNAL(“clicked(bool)”), self.buttonClicked)
- передаётся
py.user.next
Red_baron
Вы не правы. При старом стиле ничего не передается.
там, походу, по разному можно его запускать
описание сигнала есть в документации

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

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

вопрос, вообще, в том: нафига этот аргумент там
Red_baron
По идее эти назначения эквивалентны:

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

А на самом деле нет. Первый передает False, а второй нет.
Мой вопрос решается либо назначение старого стиля, либо как vrabey написал во #2 посте.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB