Найти - Пользователи
Полная версия: PyQt. Вывести результат функции в окно.
Начало » GUI » PyQt. Вывести результат функции в окно.
1 2
vshnukrshna
Здравствуйте. Использую python 2.7.5, PyQt 4.8.4. (я правда совсем новичок еще).
Сейчас я могу создать окно с кнопкой, нажимая которую, выполняется какая-либо функция. (Например: инкремент числа). Но результат функции выводится на консоль. А как сделать так, чтоб он еще выводился в окно и отображался рядом с кнопкой?
mks
Положите в ваше окно рядом с кнопкой QLineEdit, и вызывайте его слот setText() добавляя туда ваше число.
vshnukrshna
Спасибо, но как-то пока не хочет работать…

Итак, кусок кода:

z=0
def myfunc1():
        global z
        z=z+1
        print (z)
def changeText(self, event):
        lineEdit.setText(str(z))
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(613, 545)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(244, 352, 111, 51))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(242, 290, 111, 20))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        
       
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), myfunc1)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), changeText)
    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.pushButton.setText(_translate("Form", "click me", None))
        self.lineEdit.setText(_translate("Form", "functionvalue", None))
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())


Программа запускается, но при нажатии кнопки выдает ошибку:
TypeError: ChangeText() takes exactly 2 arguments (0 given)
mironich
vshnukrshna, функция changeText принимает 2 аргумента..
А сигнал кнопки clicked кнопки только один арг-мент передает..
И то наверное надо указывать так чтобы он передался:
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked(bool)"), changeText)
Ну и в функц. не надо указывать первым аргуметом параметр self т.к туда не передастся ссылка на обьект.
Вообще проще использовать новый сигнал сигналов\слотов:
Это примерно так:
self.pushButton.clicked.connect(changeText)
vshnukrshna
Итак, я более-менее разобрался и теперь все работает, но я хочу немного расширить задачу…
class MyForma1(object):
    def AddWidgets1(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(613, 545)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(244, 352, 111, 51))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(242, 290, 111, 20))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
     
        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.changeText)
    def retranslateUi(self, Form):
        self.pushButton.setText(_translate("Form", "Click me", None))
        self.lineEdit.setText(_translate("Form", "functionvalue", None))
class MyForma2(QtGui.QDialog, MyForma1):
    def __init__(self, z11=0):
        QtGui.QDialog.__init__(self)
        self.AddWidgets1(self)
        self.z = z11
    def myfunc1(self):
        self.z+=1
    def changeText(self):
        self.myfunc1()
        self.lineEdit.setText(str(self.z))
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Forma = MyForma2()
    Forma.show()
    sys.exit(app.exec_())

Здесь, текст в lineEdit будет меняться только при нажатии кнопки.. А можно-ли как-то сделать так, чтоб значение функции транслировалось в lineEdit постоянно, без участия кнопки? Например, функция может меняться при появлении какого-нибудь события (приход сигнала с датчика) и надо постоянно отслеживать значение этой функции.
mks
При наступлении события от датчика обрабатываете его (пересчитываете функцию) и отправляете свой сигнал в lineEdit.
vshnukrshna
mks
При наступлении события от датчика обрабатываете его (пересчитываете функцию) и отправляете свой сигнал в lineEdit.
Спасибо, я это понимаю
Но как это реализовать?
Вот у меня есть два метода, например:
def myfunc1(self):
        self.z+=1
def changeText(self):
        self.lineEdit.setText(str(self.z))

И есть строка соединений:
QtCore.QObject.connect(<?????>, QtCore.SIGNAL(<?????>), Form.changeText)

Так вот вопрос в том, что именно поставить вместо <?????>..
Т.е мне нужно, чтоб испускателем сигнала был сам факт изменения функции. И как правильно прописать сигнал в таком случае?
mks
vshnukrshna
Т.е мне нужно, чтоб испускателем сигнала был сам факт изменения функции
Заверните свою функцию в объект-наследник QObject определите в нём сигнал который оповещает об изменении функции. В конце метода который пересчитывает функцию вызывайте сигнал:
self.my_function_change_signal.emit()
Цеплять сигналы к слотам я так понимаю вы уже научились. Если совсем туго стучите в jabber, чем смогу помогу.
У меня сейчас нет под рукой pyqt так что пример накидать не могу, пишу по памяти.
mks
сделал простой пример: simple_signal_slot в главном окне перехвачено событие движения мыши (в вашем случае надо отслеживать событие пересчёта функции), в котором берутся текущие координаты и отправляются сигналом xy в lineEdit. Запускать main.py.
Rodegast
Зачем сигнал передавать? Этим надо заниматься если функция работает в отдельно потоке, если поток один то меняй значение прямо из функции.
def mouseMoveEvent(self, event):
        tmp = 'x={0} y={1}'.format(event.x(), event.y())
        self.lineEdit.setText(tmp)
        #self.xy.emit(tmp)
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