Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我不知道';我不知道如何修复以下错误;RuntimeError:线程';中没有当前事件循环;螺纹-1';和';螺纹-2';_Python_Multithreading_Kivy - Fatal编程技术网

Python 我不知道';我不知道如何修复以下错误;RuntimeError:线程';中没有当前事件循环;螺纹-1';和';螺纹-2';

Python 我不知道';我不知道如何修复以下错误;RuntimeError:线程';中没有当前事件循环;螺纹-1';和';螺纹-2';,python,multithreading,kivy,Python,Multithreading,Kivy,我是一名编码初学者,这是我第一次使用线程。线程是我能为我的项目找到的唯一解决方案。在这个项目中,我应该在应用程序上显示哪个传感器在振动,为此我画了4个圆圈来代表传感器。因此,传感器1将是bytearray(b'\x03'),传感器2将是bytearray(b'\x04'),依此类推。我想要的是,当特征值为bytearray(b'\x03')时,传感器1的颜色发生变化 目前正在使用python 3.9创建一个通过蓝牙与arduino nano 33 iot连接的应用程序,我希望能够每0.3秒读取一

我是一名编码初学者,这是我第一次使用线程。线程是我能为我的项目找到的唯一解决方案。在这个项目中,我应该在应用程序上显示哪个传感器在振动,为此我画了4个圆圈来代表传感器。因此,传感器1将是bytearray(b'\x03'),传感器2将是bytearray(b'\x04'),依此类推。我想要的是,当特征值为bytearray(b'\x03')时,传感器1的颜色发生变化

目前正在使用python 3.9创建一个通过蓝牙与arduino nano 33 iot连接的应用程序,我希望能够每0.3秒读取一次该特性,并根据该特性的值更改画布图形的颜色。我的意图是让while循环在后台运行,每.3秒读取一次特征值。在我的主屏幕上,基于读取的值,例如,如果它读取bytearray(b'\x03'),它应该更改屏幕上一个图形的颜色。(这就是if语句的原因,因此更改颜色的条件将替换“print”(“changed color”))。此外,将有多个传感器通过bytearray(b'\x03')通过bytearray(b'\x10')进行检查,因此我不知道是否最好使用if语句,因此如果您有更好的建议,请告诉我

def background():
    async def run(address):
        async with BleakClient(address, loop=loop) as client:
            await client.get_services()
            while True:
                value = await client.read_gatt_char(r_characteristic)
                if await client.read_gatt_char(r_characteristic):
                    time.sleep(.3)
                    print("Read Value: {0}".format(value))

    loop = asyncio.get_event_loop()

def foreground():
    async def run(address):
        async with BleakClient(address, loop=loop) as client:
            await client.get_services()
            value = await client.read_gatt_char(r_characteristic)
            if await client.read_gatt_char(r_characteristic) == bytearray(b'\x03'):
                print("changed color")

    loop = asyncio.get_event_loop()
    asyncio.ensure_future(run(address))
    loop.run_forever()


b = threading.Thread(target=background)
f = threading.Thread(target=foreground)

b.start()
f.start()
但是,当我运行它时,它会返回一个错误,如下所示

raise RuntimeError('There is no current event loop in thread %r.'
     raise RuntimeError('There is no current event loop in thread %r.'    raise RuntimeError('There is no current event loop in thread %r.'
 RuntimeError: There is no current event loop in thread 'Thread-1'.
 RuntimeError: There is no current event loop in thread 'Thread-2'.

任何帮助都将不胜感激

尝试在代码末尾添加这两行:

b.join()
f.join()

可能行得通,也可能行不通,但正如Tim Roberts正确地说的那样,将线程和异步结合起来是非常不寻常的,您可能需要重构代码。

将线程和异步结合起来有些不寻常。你确定这是正确的方法吗?您的后台线程中不会运行任何内容,因为您从未调用
run()
。感谢您的帮助,但由于我需要先通过蓝牙连接到arduino,以便while循环可以读取特征值,所以我最好的方法是使用async。您建议我如何编写while循环来连接和填充后台的值?我基本上希望使用这些值来更改我拥有的kv文件上的画布颜色。那么,对我来说,执行while循环的最佳方法是什么?因为我使用async的原因是读取应用程序通过蓝牙连接的arduino nano 33物联网的特征值。因此,从技术上讲,while循环必须连接到arduino。我真的不知道该怎么办。你到底试过b.join和f.join吗?