При выполнении потока первое выполнение завершается неудачно в операторе try - PullRequest
0 голосов
/ 27 августа 2018
    from PyQt5.QtWidgets import QMainWindow, QApplication,QLineEdit, QPushButton, QWidget, QAction, QTabWidget,QVBoxLayout
from PyQt5.QtCore import (QCoreApplication, QObject, QRunnable, QThread,
                          QThreadPool, pyqtSignal)
import sys
import os
from shutil import copy2
import _thread
import time


class AThread(QThread):

    def run(self):
        count = 0
        while count < 5:
            time.sleep(1)
            print("A Increasing")
            count += 1

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setAcceptDrops(True)
        self.setWindowTitle('Learn')
        self.setGeometry(300, 300, 300, 150)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()   
        self.tab2 = QWidget()
        self.tabs.resize(300,200) 

        # Add tabs
        self.tabs.addTab(self.tab1,"Tab 1")
        self.tabs.addTab(self.tab2,"Tab 2")

        # Create first tab
        self.tab1.layout = QVBoxLayout(self)
        self.pushButton1 = QPushButton("PyQt5 button")
        self.pushButton1.clicked.connect(self.ON_PRESS)
        self.textbox = QLineEdit(self)
        self.tab1.layout.addWidget(self.textbox )
        self.tab1.layout.addWidget(self.pushButton1)
        self.tab1.setLayout(self.tab1.layout)
        #Create Textbox inputs


        # Add tabs to widget        
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)

    def using_q_thread(self):
        app = Example()
        thread = AThread()
        thread.start()
        sys.exit(app.exec_())

    def ON_PRESS(self):
###Here is the Issue
        try:
            self.using_q_thread()    
        except:
            print ("Error: unable to start thread")
###Drag and Drop files to directory
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()

Надеюсь, я правильно спрашиваю об этом, но всякий раз, когда используется QThread, возникает небольшая ошибка. первая попытка доступа к поточной функции приводит к сбою оператора try, но затем он сразу же срабатывает. Мне просто любопытно, является ли это частью функциональности или есть какие-либо проблемы с моим кодом.

1 Ответ

0 голосов
/ 27 августа 2018

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

Я не вижу необходимости создавать еще один Пример в using_q_thread, другая проблема состоит в том, что поток - это локальная переменная, которая будет исключена, поэтому поток должен быть членом класса для увеличения его области действия.

import sys
import time
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTabWidget, QPushButton, QLineEdit


class AThread(QThread):
    def run(self):
        count = 0
        while count < 5:
            time.sleep(1)
            print("A Increasing")
            count += 1

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setAcceptDrops(True)
        self.setWindowTitle('Learn')
        self.setGeometry(300, 300, 300, 150)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tab1 = QWidget()   
        self.tab2 = QWidget()
        self.tabs.resize(300,200) 

        # Add tabs
        self.tabs.addTab(self.tab1,"Tab 1")
        self.tabs.addTab(self.tab2,"Tab 2")

        # Create first tab
        self.tab1.layout = QVBoxLayout()
        self.pushButton1 = QPushButton("PyQt5 button")
        self.pushButton1.clicked.connect(self.ON_PRESS)
        self.textbox = QLineEdit(self)
        self.tab1.layout.addWidget(self.textbox )
        self.tab1.layout.addWidget(self.pushButton1)
        self.tab1.setLayout(self.tab1.layout)
        #Create Textbox inputs


        # Add tabs to widget        
        self.layout.addWidget(self.tabs)

    def using_q_thread(self):
        self.thread = AThread()
        self.thread.start()


    def ON_PRESS(self):
        self.using_q_thread()    

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
...