多线程,队列,GUI和侦听器

时间:2020-11-12 19:07:50

标签: 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) :
    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'未定义。

我确切地知道为什么会这样,但是我不确定如何解决这个问题。

我需要将它们作为单独的类分别在单独的线程中运行,因为它们都连续运行,并且我不希望它们相互锁定,而是需要它们同时运行。

1 个答案:

答案 0 :(得分:4)

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)
豫ICP备18024241号-1