Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 有没有办法在kivy应用程序中使用原始输入(或等效输入),而不中断主循环?_Python_Loops_Input_Kivy_Barcode - Fatal编程技术网

Python 有没有办法在kivy应用程序中使用原始输入(或等效输入),而不中断主循环?

Python 有没有办法在kivy应用程序中使用原始输入(或等效输入),而不中断主循环?,python,loops,input,kivy,barcode,Python,Loops,Input,Kivy,Barcode,我知道kivy中的任何循环都会中断主循环并导致问题。我正在编写和应用程序,需要等待控制台上通过条形码扫描仪发送的输入,条形码扫描仪将代码作为字符串发送到终端,一旦扫描,问题是如果我使用原始输入,那么主kivy循环会中断,那么有没有一种方法可以在不与kivy应用程序冲突的情况下执行此操作?非常感谢您的帮助。我曾经遇到过类似的情况(等待RFID阅读器的输入)。 我的最终解决方案是在另一个守护进程线程中等待输入,并将任何可能的输入填充到队列(),然后使用Kivy时钟定期读取该队列()。下面是一个示例代

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

我曾经遇到过类似的情况(等待RFID阅读器的输入)。 我的最终解决方案是在另一个守护进程线程中等待输入,并将任何可能的输入填充到
队列()
,然后使用Kivy时钟定期读取该
队列()。下面是一个示例代码

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\u队列中可能存在的数据。示例代码:

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

我曾经遇到过类似的情况(等待RFID阅读器的输入)。 我的最终解决方案是在另一个守护进程线程中等待输入,并将任何可能的输入填充到
队列()
,然后使用Kivy时钟定期读取该
队列()。下面是一个示例代码

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\u队列中可能存在的数据。示例代码:

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

您是否尝试过sys.stdin.read()
?它不会阻塞,但可能也不会返回任何内容。此外,我正在尝试使用(扫描仪提供的)代码更新标签,我这样做没有问题,但我需要获取更新标签的代码,我不知道如何在不使用原始输入或sys.stdin.readline()的情况下执行此操作。如果扫描时聚焦,代码也会打印在文本输入文本中(如果有帮助的话)。是的,我最初使用的是sys.std.readline(),但如果没有扫描,应用程序就会停止,而不是像您建议的那样不返回任何内容。如果我使用sys.stdin.read()或readline(),应用程序甚至无法工作。如果我使用原始输入,应用程序在等待输入时会冻结,甚至不会读取输入。我猜是因为我首先说了关于kivy主回路的话,这在kivy doc中很清楚。有没有办法让sys.stdin.read()按照您的建议工作,即在扫描产品时仅使用该值?我尝试使用if sys.stdin.read!=无:,如果sys.stdin.read()!=“”和类似,但不起作用。我也不知道这个评估是否准确。也非常感谢您的帮助。您是否尝试过
sys.stdin.read()
?它不会阻塞,但可能也不会返回任何内容。此外,我正在尝试使用(扫描仪提供的)代码更新标签,我这样做没有问题,但我需要获取更新标签的代码,我不知道如何在不使用原始输入或sys.stdin.readline()的情况下执行此操作。如果扫描时聚焦,代码也会打印在文本输入文本中(如果有帮助的话)。是的,我最初使用的是sys.std.readline(),但如果没有扫描,应用程序就会停止,而不是像您建议的那样不返回任何内容。如果我使用sys.stdin.read()或readline(),应用程序甚至无法工作。如果我使用原始输入,应用程序在等待输入时会冻结,甚至不会读取输入。我猜是因为我首先说了关于kivy主回路的话,这在kivy doc中很清楚。有没有办法让sys.stdin.read()按照您的建议工作,即在扫描产品时仅使用该值?我尝试使用if sys.stdin.read!=无:,如果sys.stdin.read()!=“”和类似,但不起作用。我也不知道这个评估是否准确。也非常感谢你的帮助。你好@Juggernaut谢谢你的帮助。我有一个问题,carts变量来自哪里?此外,我还注意到,扫描条形码的输入(产品代码)会进入当前处于焦点的任何应用程序,即如果终端上有im,则进入终端;如果文本编辑器中有im,则进入文本编辑器;如果有焦点,则进入任何文本输入(例如常春藤文本输入、堆栈溢出注释框等),但是,如果没有文本输入聚焦,什么都不会发生,我是否必须使用文本输入聚焦来获取代码,或者即使没有文本输入字段聚焦,输入侦听也会起作用?@AmonTzar我修复了
carts
名称。这是因为从我提到的项目复制。很抱歉但是为什么您希望它将输入写入焦点输入?我的意思是,你为什么一开始就这样编程呢?TextInput是一个想法,因为使用原始输入和read()是有问题的,但最初我想(我更愿意)使用输入作为变量来使用它,我最终只想将扫描的代码显示到一个kivy标签中,当然,当我的应用程序更高级时,请将其用于数据库操作等。。。我遇到的问题是,让应用程序在任何时候都只使用任何扫描的代码而没有任何问题。我正在测试你的代码,并将其实现到应用程序中,我现在刚刚召开了一次会议,随后将继续并更新结果。多谢各位。最后一个问题,扫描的代码是否会输入到“data”变量中?正如我迄今为止所做的尝试(我尝试打印数据变量),它似乎没有得到扫描的代码,或者可能我没有完全理解代码。再次感谢。我觉得我离解决方案越来越近了。你好@Juggernaut谢谢你的帮助。我有一个问题,carts变量来自哪里?此外,我还注意到,扫描条形码的输入(产品代码)会进入当前处于焦点的任何应用程序,即如果终端上有im,则进入终端;如果文本编辑器中有im,则进入文本编辑器;如果有焦点,则进入任何文本输入(例如常春藤文本输入、堆栈溢出注释框等),但是,如果没有文本输入聚焦,什么都不会发生,我是否必须使用文本输入聚焦来获取代码,或者即使没有文本输入字段聚焦,输入侦听是否也会工作?@AmonTzar我修复了
汽车