2014-12-11 2 views
0

У меня есть приложение, которое должно открыть адрес веб-браузера после нажатия кнопки. Основная функция выглядеть следующим образом:PySide Не удалось подключить сигнал, нажатый()

class MainWindow(QtGui.QDialog): 
    def __init__(self, parent = None): 
     super(MainWindow, self).__init__(parent = parent) 
     self.button_layout = QtGui.QHBoxLayout(self) 
     self.webButton = PicButton(QtGui.QPixmap("images/button.png")) 
     self.filmButton.clicked.connect(openWebpage("http://some.web.adress")) 
     self.button_layout.addWidget(self.webButton) 

И функция для открытия веб-браузера выглядит следующим образом:

def openWebpage(address): 
    try: 
     import webbrowser 

     webbrowser.open(address) 

    except ImportError as exc: 
     sys.stderr.write("Error: failed to import settings module ({})".format(exc)) 

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

Failed to connect signal clicked(). 

Простые функции, подключенные к этой кнопке, работают правильно (например, печать текста на консоль). Есть идеи?

+0

Is 'self.filmButton.clicked.connect (openWebpage (" http: //some.web.adress "))' correct? Я имею в виду именно 'openWebpage (« http: //some.web.adress »)' -part. Я думал, что разрешено использовать его как 'self.filmButton.clicked.connect (openWebpage)'. Кроме того, укажите тип «filmButton». –

+0

[Проверить это] (http://stackoverflow.com/questions/13894866/pyside-connection-error-runtimeerror-failed-to-connect-signal-clicked#comment19156148_13894993), @VictorPolevoy прав. –

ответ

0

Чтобы передать аргумент в слоте вам нужно построить лямбда-выражение:

self.filmButton.clicked.connect(lambda: openWebpage("http://some.web.adress")) 

Чтобы объяснить это немного больше, метод подключения() принимает вызываемый объект в качестве аргумента. Выражение лямбда, которое является в основном анонимной функцией, является одним из таких вызываемых объектов. Вы можете также обернуть свой вызов функции в модуле functoolspartial(), чтобы достичь того же. Подробнее о том, что представляет собой Python, можно найти, см. What is a "callable" in Python?

0

Как говорят люди немного раньше - используйте лямбда или используйте нормальный slot, который дает (по крайней мере, мне) более читабельность.

def __init__(self): 
    self.filmButton.clicked.connect(self._film_button_clicked) 

@pyqtSlot() # note that this is not really necessary 
def _film_button_clicked(self): 
    self.openWebpage('http://some.web.adress') 
Смежные вопросы