멀티 스레딩, 큐, GUI 및 리스너

Nov 13 2020

설정하려는 것이 있습니다. 여기에 작은 하위 예제를 제공하겠습니다.

내 프로젝트 목표는 GUI를 실행하고 변경 사항을 수신하는 ROS 리스너를 실행 한 다음 버튼 클릭 등을 통해 GUI에 출력하는 것입니다.

다음은 내 설정의 예입니다.

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)

그러면 내 Gui_UI.py는

## 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)

마지막으로 내 Listener_Class.py

## 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)

따라서 문제는 해당 함수를 호출하는 버튼을 클릭하면 NameError : name 'q'is not defined.

그 이유를 정확히 알고 있지만 어떻게 해결해야할지 모르겠습니다.

둘 다 지속적으로 실행되고 서로를 잠그지 않고 동시에 실행해야하기 때문에 이들 각각을 별도의 스레드에서 별도의 클래스로 실행해야합니다.

답변

4 GijsWobben Nov 19 2020 at 19:58

q 실제로 존재하지 않습니다.

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

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

에서 __init__정의 self.q하므로 send_var_to_UI방법을 다음과 같이 변경해야 합니다.

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