2017-02-03 26 views
0

Im folgenden Code kann ich einen UPC-Code mit einem USB-Barcode-Scanner scannen und nehmen Sie diese 12-stellige numerische Zeichenfolge und eine Suche auf sie mit einem BASH-Skript (genannt Bss), die erlischt mit dem Internet, Lynx, und finden Sie das Produkt und strippen Sie alle UN-benötigten Text auf die Beschreibung.Tkinter, Aktualisierung Etikett und Verwendung nach

Das Problem ist, dass es eine Beschränkung gibt, wie oft ein Etikett aktualisiert werden kann. In der Funktion def get_key(self, event) kann ich das Label zweimal aktualisieren. Die Anzeige des UPC-Codes im Status-Frame und das Zurücksetzen des Labels auf "Ready ...". Jede weitere Aktualisierung dieses Etiketts führt nur zur Anzeige des zuletzt definierten Etiketts. Es vergisst alles dazwischen.

Warum? In der zweiten Funktion def get_info(self) kann ich es nur einmal aktualisieren. Das ist zu den Produktinformationen, und das bleibt, bis ich wieder scanne und dann aktualisiert, um das neue Element gescannt, was in Ordnung ist, aber nicht die gewünschten Ergebnisse, die die Änderung des Etiketts zurück zu "Warten ..." ist. Jede Information oder Anleitung wäre willkommen.

#!/usr/bin/python 

import Tkinter as tk 
from Tkinter import * 
import subprocess 

class ShopApp(tk.Tk): 

    def __init__(self): 
     tk.Tk.__init__(self) 

     frameCenter = Frame(self) 
     frameCenter.configure(height=50, width=300, background='#dddbe3') 
     frameCenter.propagate(0) 
     frameCenter.pack(side=TOP) 

     frameStatus = Frame(self, padx=2, pady=2) 
     frameStatus.configure(height=30, width=300) 
     frameStatus.propagate(0)  
     frameStatus.pack(side=BOTTOM) 

     self.mdItemAdded = tk.Label(frameCenter, text="Waiting...") 
     self.mdItemAdded.config(font=('sans', 12, 'bold')) 
     self.mdItemAdded.pack(side=BOTTOM, fill=X) 

     self.code = ' '  
     self.status = tk.Label(frameStatus, text="Ready...") 
     self.status.config(height=20, bd=1, relief=SUNKEN, anchor=W) 
     self.status.pack(side=BOTTOM, fill=X) 
     self.bind('<Key>', self.get_key) 

    #Getting Barcode scan 
    def get_key(self, event): 
     if event.char in '': 
      self.code += event.char  
      self.status['text'] = "UPC Code: " + self.code  

     elif self.status == self.status: 
      self.status.after(3000)  
      self.status['text'] = "Ready..." 
      self.get_info() 
      self.code = ' ' 

    #Displaying Results 
    def get_info(self): 
    result = subprocess.call('/home/pi/python/shop/bss ' + (self.code), shell=True) 
     if result == 0: 
      self.f = open ('final.txt', 'r') 
      self.line = self.f.readline() 
      self.f.close() 
      self.mdItemAdded.config(text="Item Added...\n" + self.line) 
      self.mdItemAdded.update_idletasks() 
      self.mdItemAdded.after(4000) 
      self.mdItemAdded.config(text="Waiting...") 


shopper = ShopApp() 
shopper.mainloop() 
+0

einige Ihrer Einrückung ist falsch. Können Sie bitte auch ein Beispielprogramm schreiben, das nicht die Ausführung eines speziellen Skripts erfordert, das nicht in der Frage enthalten ist? –

+0

FWIW, es gibt absolut keine Begrenzung wie oft man ein Etikett ändern kann. –

+0

Ich habe es herausgefunden. Ich musste 'self.mdItemAdded.update_idletasks()' am Ende der 'def get_info (self)' Funktion hinzufügen. Ich habe meinen Code aktualisiert, um die Änderungen widerzuspiegeln. –

Antwort

1

Ich habe meine Frage aktualisiert, um die Korrekturen im Code widerzuspiegeln, der mein Problem letztendlich gelöst hat.

Das Update ist:

self.mdItemAdded.update_idletasks() 
self.mdItemAdded.after(4000) 
self.mdItemAdded.config(text="Waiting...") 

bis zum Ende der def_get_info(self) Funktion hinzugefügt. Ich hoffe, das hilft jedem, der das gleiche Problem hat.