2017-05-31 11 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標籤,當然,當我的應用程序更先進使用它的數據庫操作等...我有麻煩的是使應用程序只需使用任何掃描的代碼沒有任何問題。 –

相關問題