Найти - Пользователи
Полная версия: PyQt4. Реализация собств. слотов на Python ?
Начало » GUI » PyQt4. Реализация собств. слотов на Python ?
1
gmorgunov
Добрый день.
Пробую реализовать свой слот на PyQt4, чего-то не идет.
Программа при каждом нажатии на кнопку печатает в консоли счетчик нажатий.
На С++ - все работает.
Counter.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui,QtCore
WHAT=0 # глоб. прем. - счетчик

class Counter(QtGui.QWidget): # класс счетчиков
def __init__(self,*args): # конструктор
QtGui.QWidget.__init__(self,*args)
def myreaction(): # реализация слота
global WHAT
WHAT +=1
print "It's myreaction WHAT=",WHAT

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
counter=Counter() # создаем объект
button = QtGui.QPushButton() # создаем кнопку

# 1) QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), Counter().myreaction())
# 2) QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), Counter.myreaction())
# 3)QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"), counter, Counter.myreaction())
print WHAT # дублирующая печать
button.show()
sys.exit(app.exec_())
Ругается на закомментированые строчки:
1)TypeError: myreaction() takes no arguments (1 given)

2)TypeError: unbound method myreaction() must be called with Counter instance as first argument (got nothing instead)

3) То же,что и 2)

Если надо могу рабочий код C++ привести.

Заранее спасибо.
j2a
человек, у тебя отступы поплыли и ты self для метода myreaction не указал, в общем, учи матчасть питона.
gmorgunov
j2a
человек, у тебя отступы поплыли и ты self для метода myreaction не указал, в общем, учи матчасть питона.
Отступы - это при передаче(kate). А по существу ? :)
gmorgunov
Разобрался. Может кому интересно:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui,QtCore
WHAT=1

class Counter(QtGui.QPushButton):
global WHAT
what=WHAT
def __init__(self, parent=None):
super(Counter, self).__init__(parent)
self.connect(self, QtCore.SIGNAL("clicked()"), self.myreaction)

def myreaction(self):
self.emit(QtCore.SIGNAL("mysignal"), self.what)

def myprint(self,what):
global WHAT
what = WHAT
print "It's myprint WHAT=%d" % what
WHAT +=1

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
counter = Counter()

QtCore.QObject.connect(counter, QtCore.SIGNAL("mysignal"), counter.myprint)

counter.show()
sys.exit(app.exec_())
gmorgunov
Можно и без self
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui,QtCore
WHAT=0 # глоб. прем. - счетчик

class Counter(QtGui.QWidget): # класс счетчиков
def __init__(self,*args): # конструктор
QtGui.QWidget.__init__(self,*args)

def myreaction(): # реализация слота
global WHAT
WHAT +=1
print "It's myreaction WHAT=",WHAT

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
counter=Counter() # создаем объект
button = QtGui.QPushButton() # создаем кнопку

QtCore.QObject.connect(button, QtCore.SIGNAL("clicked()"),myreaction)

button.show()
sys.exit(app.exec_())
j2a
Ну да, в первом случае – метод класса, во втором – функция. Не чувствуешь разницы?
gmorgunov
j2a
Тонкое наблюдение … Учту при общении с вами.
Ferroman
Что-то тут не так, учитывая что я вижу слово global в коде.
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