Python 多线程、队列、GUI和侦听器

Python 多线程、队列、GUI和侦听器,python,user-interface,queue,python-multithreading,Python,User Interface,Queue,Python Multithreading,我有一些我正在尝试设置的东西。我将尝试在这里提供一个小的子示例 我的项目目标是运行一个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) :

我有一些我正在尝试设置的东西。我将尝试在这里提供一个小的子示例

我的项目目标是运行一个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)
最后,我的监听器_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'没有定义

我猜这到底是为什么,但我不知道如何解决这个问题


我需要将它们作为各自独立的类在不同的线程中运行,因为它们都在连续运行,我不希望它们相互锁定,需要它们同时运行。

q
实际上并不存在:

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

    def send_var_to_UI() :
         var = 5
         q.put(var)
\uuuu init\uuuu
中定义了
self.q
,因此应该将
发送变量到UI
方法更改为:

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

为什么将
launch\u qui
作为其参数传递,然后用于构造
Gui\u UI
实例,而不是传递已构造的作为线程运行的
Gui\u UI
实例?您既不显示如何实例化
Listener\u类
也不显示从何处获取您的错误您需要包含一个stacktrace及其引用的代码。请提供一个示例,我们需要能够重现此示例以发现您的问题,不仅如此,还可能在
return\u var\u using\u queue()
下,您可能希望将其更改为
my\u var=self.q.get()
。另外,实现线程的另一种方法可能会使您受益,这是我今天正在研究的方法