python - 多线程、队列、GUI 和侦听器
问题描述
我有一些我正在尝试设置的东西。我将尝试在这里提供一个小的子示例。
我的项目目标是运行一个 GUI 并运行一个 ROS 侦听器来侦听更改,然后在单击按钮和其他内容时将它们输出到 GUI。
这是我的设置示例
主文件
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。
我有我的猜测到底为什么会这样,但我不知道如何解决这个问题。
我需要将它们中的每一个作为它们自己的单独类在单独的线程中运行,因为它们都在连续运行,我不希望它们相互锁定,并且需要它们同时运行。
解决方案
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)
推荐阅读
- java - 我可以在不同的类中覆盖方法吗?
- google-chrome - 停止浏览器从服务器请求 service-worker.js
- javascript - 如何为根节点的直接子节点制作选择器?
- powershell - 如何以指定格式将数组的值输出到文本文件
- wordpress - Wordpress 问题,更新后
- asp.net-mvc - Azure Active Directory 身份验证突然停止工作并将页面重定向到登录/注销页面。我怎样才能让它工作?
- python - 在最后两点设置小数
- javascript - javascript数组即将为空
- vb.net - 有没有一种方法可以从 vb.net 中的数组生成随机字符串而不会重复
- jenkins - 如何在 Jenkins 上制作 groovy 以与凭据相同的方式屏蔽变量的输出?