多线程、队列、GUI和监听器



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

我的项目目标是运行一个GUI和一个ROS侦听器,该侦听器侦听更改,然后在单击按钮等操作时将其输出到GUI。

这是我设置的一个例子

主.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'没有定义。

我有我的猜测,确切的原因是,但我不确定如何解决这个问题。

我需要让它们中的每一个都作为自己的独立类在独立的线程中运行,因为它们都是连续运行的,我不希望它们相互锁定,并且需要它们同时运行。

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)

最新更新