Уведомления

Группа в Telegram: @pythonsu

#1 Март 9, 2014 13:25:12

HedgehogKS
Зарегистрирован: 2014-03-09
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

pyqt4 и правильное взаимодействие с ним

Здравствуйте.
Ситуация такая: пытаюсь сделать чтото вроде окошка вывода в pyqt4, и управлять им из приложения, но ни каким образом не получается взаимодействовать с этим окном и изменять в нём информацию. Код следующий:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        ...
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(-2, -4, 362, 490))
        ...
    def setText(self, string):
        self.textEdit.setText(string)
class MyWidget (QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self,parent=None,selected=[],flag=0,*args):
        QtGui.QWidget.__init__(self,parent,*args)
        self.setupUi(self)
app = QtGui.QApplication(sys.argv)
widget = MyWidget(None)
widget.setText("SomeString1") 
widget.show()
time.sleep(2)
widget.setText("SomeString2") 
time.sleep(2)
widget.setText("SomeString3") 
sys.exit(app.exec_())
widget.setText("SomeString4")

widget.show() выполнен, и создаётся впечатление, что я сначала должен увидеть надпись “SomeString1”, через 2 секунды “SomeString2”, еще через 2 секунды “SomeString3”, но этого не происходит. Попытка выводить текст после команды “sys.exit(app.exec_())” также ни к чему не приводит, т.к. выполнение приложения останавливается на этой команде до закрытия окна.
Я также попробовал запустить окно отдельным потоком, но pyqt не даёт этого сделать.
Как же правильно организовать подобную работу окна, чтобы можно было изменять его содержимое из программы?

Используется pyqt4 и python27.

Отредактировано HedgehogKS (Март 9, 2014 13:27:11)

Офлайн

#2 Март 9, 2014 13:33:10

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

pyqt4 и правильное взаимодействие с ним

проблема в том что консольные и GUI приложения работают совсем по разному.
консольные выполняются подряд и показывают данные если их попросишь тоже подряд.
GUI выполняют все подряд в тот момент когда пытаются сконфигурирваться и НИЧЕГО не показывают.
А дальше они что-то делают только в ответ на возникновение событий, которые обрабатываются в цикле обработки сообщений( app.exec_()), таких как сигналы таймера, нажатие на кнопки на клавиатуре и т.п.
Поэтому чтобы вы ни делали ни до ни после app.exec_() вы ничего не увидите. Надо делать в нем.



Офлайн

#3 Март 9, 2014 13:54:26

HedgehogKS
Зарегистрирован: 2014-03-09
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

pyqt4 и правильное взаимодействие с ним

Не совсем тогда понимаю, как правильно организовать работу, допустим, простейшего irc клиента.
Организован цикл, периодически приходят сообщения, и я хочу выводить их в своё, оформленное определенным образом окно. Я мало знаком с питоном, что бы вы посоветовали использовать в данном случае?

Офлайн

#4 Март 9, 2014 20:56:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

pyqt4 и правильное взаимодействие с ним

from PyQt4 import QtGui, QtCore
 
class Window(QtGui.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
    
    def initUI(self):
        self.textEdit = QtGui.QTextEdit(self)
        self.setCentralWidget(self.textEdit)
        
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.printText)
        self.timer.start(1000)
        
        self.ticks = 0
        
        self.setGeometry(500, 500, 250, 150)
        self.setWindowTitle('TextEdit + Timer')
        self.show()
    
    def printText(self):
        
        curText = self.textEdit.toPlainText()
        if self.ticks < 5:
            if curText:
                self.textEdit.setText(curText + ' a')
            else:
                self.textEdit.setText('a')
            self.ticks += 1
        else:
            self.textEdit.setText(curText + '\nok')
            self.timer.stop()
 
def f():
    app = QtGui.QApplication([])
    win = Window()
    app.exec_()
 
f()



Отредактировано py.user.next (Март 9, 2014 20:59:48)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version