Найти - Пользователи
Полная версия: Процессы в PyQt4
Начало » Python для новичков » Процессы в PyQt4
1 2
OzXaker
как сделать так что бы процессы шли независимо друг от друга , а не заглушал один другого
———————————————————————–
from PyQt4 import QtCore, QtGui
class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        (self.tm, self.pr) = time.sleep, QtGui.qApp.processEvents
        self.label = QtGui.QLabel("Процесс не запущен")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.Btn = QtGui.QPushButton('&Кнопка1 АКТИВНА') # Создаём кнотку
        self.Btn2 = QtGui.QPushButton('&Кнопка2 АКТИВНА') # Создаём кнотку
        self.vbox = QtGui.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.Btn)
        self.vbox.addWidget(self.Btn2)
        self.setLayout(self.vbox)
        self.connect(self.Btn, QtCore.SIGNAL("clicked()"), self.Tm1) # Метод обработки нажатия
        self.connect(self.Btn2, QtCore.SIGNAL("clicked()"), self.Tm2) # Метод обработки нажатия
    def Tm1(self): # Создаём функцию растягивания окна
        #self.showMaximized() # Делаем максимальный размер окна
        self.setWindowOpacity(0.9) # Задаём прозрачность окна от 0.1 до 1.0
        self.Btn.setDisabled(True)
        self.label.setText("Процесс запущенен")
        for i in range(-10,1):
            self.pr(), self.tm(1)
            self.Btn.setText("&Кнопка1 НЕ АКТИВНА: "+ (str(i)[1:]))
        self.Btn.setText("&Кнопка1 АКТИВНА")
        self.label.setText("Процесс окончен")
        self.Btn.setDisabled(False)
        self.pr(), self.tm(1)
        self.label.setText("Процесс не запущен")
    def Tm2(self): # Создаём функцию растягивания окна
        #self.showMaximized() # Делаем максимальный размер окна
        self.setWindowOpacity(0.9) # Задаём прозрачность окна от 0.1 до 1.0
        self.Btn2.setDisabled(True)
        self.label.setText("Процесс запущенен")
        for i in range(-10,1):
            self.pr(), self.tm(1)
            self.Btn2.setText("&Кнопка2 НЕ АКТИВНА: "+ (str(i)[1:]))
        self.Btn2.setText("&Кнопка2 АКТИВНА")
        self.label.setText("Процесс окончен")
        self.Btn2.setDisabled(False)
        self.pr(), self.tm(1)
        self.label.setText("Процесс не запущен")
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle("Заголовок окна")
    window.resize(300, 70)
    window.show()
    sys.exit(app.exec_())  
FishHook
Вы за пять лет участия в форуме не научились код оформлять?
Rodegast
> как сделать так что бы процессы шли независимо друг от друга , а не заглушал один другого

Нужно использовать потоки, а не QtGui.qApp.processEvents
OzXaker
FishHook я здесь 100 лет не был
OzXaker
Rodegast А если можно пример с QtGui.qApp.processEvents на моем коде приведите
————————————————————
Я в приципе нашол выход с использованием класса QThread
–вот небольшой пример
from PyQt4 import QtCore, QtGui
class MyThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
    def run(self):
        for i in range(1, 21):
            self.sleep(3)
            self.emit(QtCore.SIGNAL("mysignal(QString)"), "i = %s" % i)
class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.label=QtGui.QLabel("Нажмите кнопку для запуска потока")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.button=QtGui.QPushButton("Запустить процесс")
        self.vbox=QtGui.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.button)
        self.setLayout(self.vbox)
        self.thread=MyThread()
        self.connect(self.button, QtCore.SIGNAL("clicked()"),
         self.on_clicked)
        self.connect(self.thread, QtCore.SIGNAL("started()"),
         self.on_started)
        self.connect(self.thread, QtCore.SIGNAL("finished()"),
         self.on_finished)
        self.connect(self.thread, QtCore.SIGNAL("mysignal(QString)"),
         self.on_change, QtCore.Qt.QueuedConnection)
    def on_clicked(self):
        self.button.setDisabled(True)
        self.thread.start()
    def on_started(self):
        self.label.setText("Вызван метод on_started()")
    def on_finished(self):
        self.label.setText("Вызван метод on_finished()")
        self.button.setDisabled(False)
    def on_change(self, s):
        self.label.setText(s)
if __name__ == "__main__":
    import sys
    app=QtGui.QApplication(sys.argv)
    window=MyWindow()
    window.setWindowTitle("Использование класса QThread")
    window.resize(300, 70)
    window.show()
    sys.exit(app.exec_())
Rodegast
> А если можно пример с QtGui.qApp.processEvents на моем коде приведите

Я как раз и имел в виду что тебе нужен не processEvents, а QThread. В примере “mysignal(QString)” лучше замениьт на “mysignal(PyObject)”.
OzXaker
Rodegast > а QThread. В примере “mysignal(QString)” лучше замениьт на “mysignal(PyObject)”.
Заменил что то не работает ваш вариант у меня ….

Rodegast
Код в студию!
OzXaker
Rodegast На тебе старый исправь пожалуйста … у меня нет доступа к моему компу до вечера
from PyQt4 import QtCore, QtGui
class MyThread(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
    def run(self):
        for i in range(1, 21):
            self.sleep(3)
            self.emit(QtCore.SIGNAL("mysignal(QString)"), "i = %s" % i)
class MyWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.label=QtGui.QLabel("Нажмите кнопку для запуска потока")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.button=QtGui.QPushButton("Запустить процесс")
        self.vbox=QtGui.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.vbox.addWidget(self.button)
        self.setLayout(self.vbox)
        self.thread=MyThread()
        self.connect(self.button, QtCore.SIGNAL("clicked()"),
         self.on_clicked)
        self.connect(self.thread, QtCore.SIGNAL("started()"),
         self.on_started)
        self.connect(self.thread, QtCore.SIGNAL("finished()"),
         self.on_finished)
        self.connect(self.thread, QtCore.SIGNAL("mysignal(QString)"),
         self.on_change, QtCore.Qt.QueuedConnection)
    def on_clicked(self):
        self.button.setDisabled(True)
        self.thread.start()
    def on_started(self):
        self.label.setText("Вызван метод on_started()")
    def on_finished(self):
        self.label.setText("Вызван метод on_finished()")
        self.button.setDisabled(False)
    def on_change(self, s):
        self.label.setText(s)
if __name__ == "__main__":
    import sys
    app=QtGui.QApplication(sys.argv)
    window=MyWindow()
    window.setWindowTitle("Использование класса QThread")
    window.resize(300, 70)
    window.show()
    sys.exit(app.exec_())
Rodegast
Всё разобрался. Это для PySide-а нужен PyObject, а для PyQt должен быть PyQt_PyObject. Просто я в основном PySide использую по этому и напутал.
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