PyQt5 Threading - RecursionError: максимальная глубина рекурсии превышена по сравнению - PullRequest
0 голосов
/ 25 марта 2019

Глядя на нить мое приложение.Ниже приведена часть кода.Насколько я понимаю, мне нужно испустить сигнал из моего класса потока, и в моем основном классе я запускаю поток.Я просто хочу иметь возможность перемещать окно и не терять функциональность во время действия final_button.Буду признателен за любую помощь.

Редактировать: основываясь на отзывах eyllanesc, изменил мой код, чтобы быть оператором if, а не while True.Проблема все еще сохраняется - как только я нажимаю последнюю кнопку, приложение теряет контроль.Окно не может быть перемещено, и строка заголовка показывает «Не отвечает» до тех пор, пока не будут завершены действия последней кнопки.Мне интересно, могу ли я изменить свой код ниже, чтобы исправить проблему.Спасибо.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from PyQt5.QtCore import pyqtSignal
from config_assign_ui import Ui_ConfigAssign
import pyodbc
import pandas as pd

class Main(QtWidgets.QMainWindow, Ui_ConfigAssign):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self)
        self.thread = Thread()
        self.thread.start()
        self.thread.final_button.connect(self.final_button)
        self.combo_list()
        self.ImportMapButton.clicked.connect(self.import_map)
        self.ExceptButton.clicked.connect(self.except_file)
        self.FinalButton.clicked.connect(self.final_button)

    def combo_list(self):
        # do a SQL query to show a list of customer options

    def import_map(self, df_map):
        name = QFileDialog.getOpenFileName(self, "Open Map...", "T:/Drive",
                                        "Worksheets (*.xlsx;*.xlsm;*.xlsb;*.xls)")
        file = str(name[0])
        if file != '':
            while True:
                try:
                    xl = pd.ExcelFile(file)
                    self.df_map = xl.parse('Sheet1')
                    rows = self.df_map.shape[0]
                    rows = "{:,}".format(rows)
                    self.labelMapCount.setText(rows)
                except:
                    mb = QMessageBox()
                    mb.setWindowTitle('Problem with File')
                    mb.setText("Please try again")
                    mb.setStyleSheet("QLabel{min-width:180 px}")
                    mb.exec_()
                    break
                # check columns of file
                cols = ['CategoryId','CategoryName','SubcategoryId','SubcategoryName','MakeId','MakeName']
                cols_file = list(self.df_map)
                if cols_file != cols:
                    mb = QMessageBox()
                    mb.setWindowTitle('Column Error')
                    mb.setText('Columns names do not match template')
                    mb.setStyleSheet('QLabel{min-width:220 px}')
                    mb.exec_()
                    break
                else:
                    break

    def except_file(self, df_except):
        if self.ExceptCheckBox.isChecked():
            # do some processing of an exception file that the user can import

    def final_button(self):
        # check if df_map exists
        try:
            print(self.df_map.head())
            map_avail = 1
        except AttributeError:
            mb = QMessageBox()
            mb.setWindowTitle('Map Missing')
            mb.setText('Please import map first')
            mb.setStyleSheet("QLabel{min-width:200 px}")
            mb.exec_()
            map_avail = 0

        if map_avail == 1:
        #perform a bunch of actions


class Thread(QtCore.QThread):
    final_button = pyqtSignal()
    def __init__(self):
        Thread.__init__(self)

    def run(self):
        while True:
            time.sleep(2)
            self.final_button.emit()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...