マルチスレッド、キュー、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が発生することです。名前「q」が定義されていません。

それがなぜであるかについては正確に推測できますが、これを解決する方法がわかりません。

これらは両方とも継続的に実行されており、お互いをロックしたくないので、別々のスレッドで実行する独自のクラスとしてこれらをそれぞれ持つ必要があり、同時に実行する必要があります。

回答

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)