2017-05-31 12 views
1

我知道kivy中的任何循环都会中断主循环并导致问题。我正在编写和应用程序,需要等待控制台上的输入,通过条码扫描器发送,一旦它被扫描,它会在终端上以字符串形式发送代码,问题是如果我使用raw_input,那么主kivy循环会中断,那么是否有一种方法可以在不冲突kivy应用程序的情况下执行此操作?任何帮助非常感谢,非常感谢。有没有办法在不中断主循环的情况下在kivy应用程序中使用raw_input(或等价物)?

+0

您是否试过'sys.stdin.read()'?它不会阻止,但也可能不会返回任何内容。 –

+0

另外我试图使用提供的代码(由扫描仪)来更新标签,我没有问题做这个,但我需要获取代码来更新标签,我不知道如何做到这一点,而不使用raw_input或sys.stdin.readline()。此外,如果在扫描时关注焦点,则代码将以TextInput文本打印,如果有帮助的话。 –

+0

是的,我最初使用sys.std.readline(),但应用程序停止,如果没有扫描,而不是按照你的建议返回。 –

回答

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 
+1

你好@Juggernaut感谢您的帮助。我有个问题,购物车变量来自哪里?另外,我注意到,从扫描的条形码输入(产品代码)会转到任何应用程序焦点,如即时终端上的终端,文本编辑器中的文本编辑器,以及任何文本输入(例如,常春藤文本输入,堆栈溢出评论框等),如果它是焦点,但如果没有文本输入FOCUSED什么也没有发生,我将不得不使用文本输入重点获取代码或将输入侦听工作即使没有关注文本输入字段? –

+0

@AmonTzar我修正了'carts'的名字。这是由于我提到的项目复制。抱歉。但是,为什么你想要它将输入写入重点输入?我的意思是你为什么第一次用这种方式编程? – Juggernaut

+0

TextInput是一个想法,因为使用raw_input和read()有问题,但最初我想(我宁愿)使用输入作为变量来使用它,我最终只是想显示扫描的代码到一个kivy标签,当然,当我的应用程序更先进使用它的数据库操作等...我有麻烦的是使应用程序只需使用任何扫描的代码没有任何问题。 –

相关问题