有没有办法在kivy应用程序中使用raw_input(或等效)而不会中断主循环?

时间:2017-05-31 23:03:11

标签: python loops input kivy barcode

我知道kivy中的任何循环都会中断主循环并导致问题。我正在编写和应用程序,需要等待通过条形码扫描仪发送到控制台上的输入,条形码扫描器扫描后在终端上将代码作为字符串发送,问题是如果我使用raw_input然后主kivy循环被中断,那么有没有办法做到这一点,而不会与kivy应用程序冲突?非常感谢任何帮助,非常感谢。

1 个答案:

答案 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