【问题标题】:PyQt Creates Additive Dialogs After Each ClickPyQt 在每次点击后创建附加对话框
【发布时间】:2016-09-19 21:03:14
【问题描述】:

标题几乎概括了这个问题。我有一个我已经编码的 GUI,我正在尝试修改我的错误处理以更好地利用 PyQt 的信号和插槽。但是,我遇到了一些问题。我正在测试一个错误处理语句,如果用户单击特定按钮,则会出现一个对话框,告诉他们他们尚未输入正确的信息。此对话框由信号和插槽控制,并在它应该出现的时候出现。但是,如果我关闭对话框然后再次单击该按钮,对话框会弹出两次。这种情况是相加发生的。也就是说,如果我第三次单击该按钮,对话框会出现三次,依此类推。我不确定还能做什么。我尝试检查以确保所有 QThreads 结束。我什至使用了你永远不应该使用的 QThread.terminate() ,但我仍然得到了相同的结果。关于造成这种情况的任何想法?代码片段如下。

def error_check_in_thread(self, method):
    self.connect(method, QtCore.SIGNAL("selenium_error"), lambda: self.error_launch("selenium_error"))
    self.connect(method, QtCore.SIGNAL("attribute_error"), lambda: self.error_launch("attribute_error"))
    self.connect(method, QtCore.SIGNAL("name_error"), lambda: self.error_launch("name_error"))
    self.connect(method, QtCore.SIGNAL("os_error"), lambda: self.error_launch("os_error"))
    self.connect(method, QtCore.SIGNAL("finished()"), lambda: self.append_log(0))
    self.connect(method, QtCore.SIGNAL("terminated()"), lambda: self.append_log(1))
    method.start()
    return

def error_launch(self, error):
    dialog = ErrorDialogs()
        if error == "selenium_error":
            dialog.pipeline_pilot_automation_error()
        elif error == "attribute_error":
            dialog.attribute_error()
        elif error == "os_error":
            dialog.path_error()
        elif error == "session_info_error":
            dialog.session_info_error()
        self.error_counter += 1
        return

def append_log(self, exit_type):
    if exit_type == 0:
        self.log_edit_area.appendPlainText(str(MainGui.log_output[0]))
    elif exit_type == 1:
        self.log_edit_area.appendPlainText("THE METHOD WAS TERMINATED PREMATURELY\n" + "#"*50)
    MainGui.log_output = []


class WorkingThread(QtCore.QThread):
    def __init__(self, selector):
        QtCore.QThread.__init__(self)
        self.selector = selector
        self.method_info = None

    def __del__(self):
        self.wait()

    # Controls which function to launch in another thread based on button presses in MainGui
    def run(self):
        print("start")
        try:
            if self.selector == 1:
                self.method_info = "DIRECTORIES AND SUBDIRECTORIES CREATION "
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
                asa.mkdirsda(MainGui.hdg_da_path, MainGui.da_batch_folder, MainGui.da_batch_subfolders)
            elif self.selector == 2:
                self.method_info = "LIMS SAMPLE SHEET MOVEMENT TO AUTOSCORE SUBDIRECTORY "
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
                asa.mvlims(MainGui.needs_gs_lims_file, MainGui.subfolder_autoscore,
                           MainGui.lims_samplesheet)
            elif self.selector == 3:
                self.method_info = "GENOMESTUDIO "
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "STARTED FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
                asa.gsprocess(MainGui.subfolder_genomestudio, MainGui.da_batch_name,
                              MainGui.lims_samplesheet_file)
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
            elif self.selector == 4:
                self.method_info = "FINAL REPORT MOVEMENT TO AUTOSCORE SUBDIRECTORY "
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
                asa.mvfinalreport(MainGui.subfolder_genomestudio, MainGui.da_batch_name,
                                  MainGui.finalreport_file, MainGui.subfolder_autoscore)
            elif self.selector == 5:
                self.method_info = "PIPELINE PILOT AUTOMATION "
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "STARTED FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
                asa.pipelineas(MainGui.userid, MainGui.userpass, MainGui.da_batch_name,
                               MainGui.raw_data_path)
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.da_batch_name + "\n" + "#"*50)
            elif self.selector == 6:
                self.method_info = "GBS SET DIRECTORIES CREATION"
                MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                          self.method_info + "SUCCESSFUL FOR: " + MainGui.gbs_set_name + "\n" + "#"*50)
                asa.mkdirsgbs(MainGui.gbs_path, MainGui.gbs_set_name)
        except (ElementNotVisibleException, ElementNotSelectableException, NoSuchElementException,
                NoSuchWindowException, UnexpectedAlertPresentException):
            MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                      self.method_info + "FAILED DUE TO SELENIUM ERROR\n" + "#"*50)
            selenium_error = QtCore.pyqtSignal()
            self.emit(QtCore.SIGNAL("selenium_error"))
            return
        except AttributeError:
            MainGui.log_output.append("ACTION AT: " + "[[" + str(datetime.datetime.now()) + "]]" + "\n" +
                                      self.method_info + "FAILED DUE TO ATTRIBUTE ERROR\n" + "#"*50)
            attribute_error = QtCore.pyqtSignal()
            self.emit(QtCore.SIGNAL("attribute_error"))
            print("stop")
            return
        return

【问题讨论】:

    标签: python user-interface error-handling dialog pyqt4


    【解决方案1】:

    我已经回答了我自己的问题。这个问题不是由我的任何错误处理引起的,而是我如何将信息传递给我正在创建的 QThread 类实例以启动新线程。我在我的脚本的 init 方法中创建了 QThread 对象的实例,这并没有让这些实例被作为垃圾收集,因为它们一直在主 GUI 循环中使用。解决方案就是将 QThread 对象的创建移到一个单独的函数中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多