Multithreading, Queues, GUI, dan Listeners

Nov 13 2020

Saya memiliki sesuatu yang saya coba siapkan. Saya akan mencoba dan memberikan sub-contoh kecil di sini.

Tujuan proyek saya adalah menjalankan GUI dan menjalankan pendengar ROS yang mendengarkan perubahan dan kemudian menampilkannya ke GUI pada klik tombol dan sebagainya.

Berikut adalah contoh penyiapan saya

main.py

from PyQt5 import *
from Gui_UI import * # This is my GUI class
from Listener_Class import * # This is my Listener class

def launch_gui(q) :
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Gui_UI(q)
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

if __name__ == "main":
    ## A bunch of stuff to setup my ROS nodes and other random things I need to do
    q = queue.Queue()
    t2 = threading.Thread( target=Gui_UI, args=(q) )
    t2.start()
    launch_gui(q)

Maka Gui_UI.py saya adil

## Tons of imports including
import queue
import threading
import PyQt5

class Gui_UI(object) :
    def __init__(self, q) :
        self.q = q

    def return_var_using_queue() :
       my_var = q.get() 
       UI_object_I_want_to_displa_this_in.setPlaceholderText(my_var)

Akhirnya Listener_Class.py saya

## Tons of imports including
import queue
import threading
import rospy

class Listener_Class(object) :
    def __init__(self, q) :
        self.q = q

    def send_var_to_UI() :
         var = 5
         q.put(var)

Jadi masalahnya adalah setelah saya mengklik tombol yang memanggil fungsi itu, saya mendapatkan NameError: nama 'q' tidak ditentukan.

Saya memiliki dugaan saya tentang mengapa itu terjadi, tetapi saya tidak yakin bagaimana menyelesaikannya.

Saya perlu memiliki masing-masing sebagai kelas terpisah mereka sendiri yang berjalan di utas terpisah, karena keduanya terus berjalan dan saya tidak ingin mereka mengunci satu sama lain, dan memerlukannya berjalan secara bersamaan.

Jawaban

4 GijsWobben Nov 19 2020 at 19:58

q memang tidak ada:

class Listener_Class(object) :
    def __init__(self, q) :
        self.q = q

    def send_var_to_UI() :
         var = 5
         q.put(var)

Di bagian yang __init__Anda definisikan self.q, Anda harus mengubah send_var_to_UImetode menjadi:

    def send_var_to_UI(self) :
         var = 5
         self.q.put(var)