【问题标题】:Multithreading, Queues, GUIs, and Listeners多线程、队列、GUI 和侦听器
【发布时间】:2020-11-12 19:07:50
【问题描述】:

我正在尝试设置一些东西。我将尝试在此处提供一个小子示例。

我的项目目标是运行一个 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。

我有我的猜测到底为什么会这样,但我不确定如何解决这个问题。

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

【问题讨论】:

  • 为什么launch_qui 被传递q 作为它的参数,然后用于构造Gui_UI 实例,而不是传递已经构造的Gui_UI 作为线程运行的实例?
  • 你没有显示Listener_Class 是如何被实例化的,你也没有显示你在哪里得到你的错误。您需要包含堆栈跟踪及其引用的代码。
  • 我们需要能够重现此问题才能找出您的问题

标签: python user-interface queue python-multithreading


【解决方案1】:

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)

【讨论】:

  • 不仅如此,而且可能在return_var_using_queue() 下,您可能希望将其更改为my_var = self.q.get()。另外,另一种实现线程的方法可能会让您受益,这是我今天正在研究的一种方法here
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2016-12-31
  • 2011-06-17
  • 2021-11-29
  • 2011-09-15
  • 2018-04-08
相关资源
最近更新 更多