我知道kivy中的任何循环都会中断主循环并导致问题。我正在编写和应用程序,需要等待通过条形码扫描仪发送到控制台上的输入,条形码扫描器扫描后在终端上将代码作为字符串发送,问题是如果我使用raw_input然后主kivy循环被中断,那么有没有办法做到这一点,而不会与kivy应用程序冲突?非常感谢任何帮助,非常感谢。
答案 0 :(得分:0)
我曾经遇到类似的情况(等待RFID阅读器的输入)。
我的最终解决方案是等待另一个守护程序线程中的输入,并将任何可能的输入填充到Queue()
,然后使用Kivy时钟定期读取Queue()
。这是一个示例代码。
from queue import Queue, Empty
temp_queue = Queue()
READ_CARD_SLEEP_TIMEOUT = 5 # Seconds
EVENT_INTERVAL_RATE = 5
QUEUE_TIMEOUT = 1
def wait_for_blocking_io():
while True:
# Check whether input exists
data = handler.fetch_data()
if data:
temp_queue.put(data)
time.sleep(READ_CARD_SLEEP_TIMEOUT)
io_wait_thread = Thread(name='io_wait', target=wait_for_blocking_io, daemon=True)
io_wait_thread.start()
然后在您的主应用中请求kivy Clock()
检查temp_queue
中的可能数据。示例代码:
class MainScreen(Screen):
def __init__(self):
super(MainScreen, self).__init__()
self.event = Clock.schedule_interval(self.listen_for_data, EVENT_INTERVAL_RATE)
# noinspection PyUnusedLocal
def listen_for_data(self, dt):
try:
data = temp_queue.get(timeout=QUEUE_TIMEOUT)
# Do whatever you want with data
except Empty:
pass