2016-09-19 8 views
-1

タイトルはこの問題をかなり上回ります。私は既にコーディングしたGUIを持っており、PyQtのシグナルとスロットをうまく利用するためにエラー処理を変更しようとしています。しかし、私は少しの問題に遭遇しました。私はエラー処理ステートメントをテストしています。特定のボタンをクリックすると、正しい情報がまだ入力されていないことを示すダイアログが表示されます。このダイアログは信号とスロットによって制御され、想定されるときに表示されます。ただし、ダイアログを閉じてもう一度ボタンをクリックすると、ダイアログが2回ポップアップします。これは追加的に発生します。つまり、3回目にボタンをクリックすると、ダイアログが3回表示されます。他に何をするべきか分かりません。私はすべてのQThreadsが終了することを確認することを試みた。私はQThread.terminate()を使うべきではありません。あなたは決して実行すべきではありません。私はまだ同じ結果を得ました。これを引き起こしているものは何ですか?コードスニペットは以下のとおりです。PyQtは、クリックごとに追加ダイアログを作成します。

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 

答えて

0

私自身の質問に答えました。この問題は、私のエラー処理が原因ではなく、新しいスレッドを開始するために作成したQThreadクラスインスタンスに情報を渡す方法でした。私はQThreadオブジェクトのインスタンスをinitというスクリプトの中に作成していましたが、メインのGUIループで常に使用されていたため、インスタンスをガベージとして収集することはできませんでした。その解決策は、QThreadの異議申し立ての作成を別の機能に移すことでした。

関連する問題