2017-06-15 7 views
0

Ich weiß, dass diese Frage schon mehrmals gestellt wurde, aber keine der Lösungen, die ich auf den anderen Posts sehe, funktioniert für mich (ich bin mir sicher, dass ich sie falsch implementiere).TKinter Etikett wird nicht aktualisiert

Ich arbeite an einer einfachen Suchschnittstelle, um nach einer ID in einer Liste von IDs zu suchen und die Eigenschaften zurückzugeben, die mit dieser ID verknüpft sind, die ich angezeigt werden möchte. Ich versuche derzeit tkinter auf Python 3.6 zu verwenden, aber ich bin offen für eine andere Methode, wenn das besser wäre.

Mein aktueller Code folgt:

from tkinter import * 

class User(object): 

    def __init__(self, uid, name, cc): 
     self.uid = uid 
     self.name = name 
     self.cc = cc 

ID1 = User('111111','NAME', 0000) 

ID2 = User('222222','NAME', 0000) 

ID3 = User('333333','NAME', 0000) 

users = [ID1, ID2, ID3] 

lst = "" 

search_input = "" 

main = Tk() 
main.title("Field Lookup") 
main.geometry('320x240') 

frame1 = Frame(main, height=200, width=200) 
frame1.pack() 

l1 = Label(frame1, text="Enter User ID") 
l1.pack() 

entry = Entry(frame1, width=30, textvariable=search_input) 
entry.pack() 

l2 = Label(frame1, textvariable=lst) 
l2.pack(side=BOTTOM) 

def updt(): 
    l2.configure(text=lst) 
    main.update_idletasks() 

def search(): 
    for u in users: 
     if u==search_input: 
      lst = u.uid,u.name,u.cc 
      print(lst) 
      updt() 

def clear(): 
    entry.delete(0, END) 
    lst = None 
    updt() 

button1 = Button(frame1, text="Search", command=search) 
button1.pack(side=LEFT) 

button2 = Button(frame1, text="Clear", command=clear) 
button2.pack(side=RIGHT) 

main.mainloop() 

Diese zum größten Teil funktioniert, aber das Etikett, das die Ergebnisse zurückgeben sollte nicht aktualisieren. Zusätzlich zu der Funktion updt(), die ich derzeit habe, habe ich auch versucht, main.update() im Rumpf der Suchfunktion sowie main.update_idletasks() aufzurufen. Ich habe auch versucht, beide kurz vor main.mainloop() zu rufen, wieder ohne Erfolg. Derzeit wird daran gearbeitet, einschließlich der Löschfunktion, und die Suchfunktion wurde unabhängig getestet, um sicherzustellen, dass sie ordnungsgemäß funktioniert. Das Problem besteht also darin, dass das Etikett nicht aktualisiert wird, soweit ich das beurteilen kann. Ich bin sehr neu in Python, also jede Hilfe würde massiv geschätzt werden.

** EDIT **

Ich fand, dass, wenn ich meine Variablen search_input und lst auf der Konsole zu drucken, sie als PY_VAR0 und PY_VAR1 lesen, anstatt den Druck der Saiten sie enthalten sollte. Ich denke, dass ich einen Weg finden muss, auf diese enthaltenen Strings zuzugreifen, aber ich bin mir nicht sicher, wie ich das machen soll. Einfach als str Gießen() führt nur zu einer Reihe von PY_VAR (n)

EDIT 2

für die PY_VAR Ausgabe Suche this question ergab, das mein Problem behoben. Arbeitscode folgt:

from tkinter import * 

class User(object): 

    def __init__(self, uid, name, cc): 
     self.uid = uid 
     self.name = name 
     self.cc = cc 
##Had to set cc variable as string to work with join method 
ID1 = User('111111','NAME', '0000') 

ID2 = User('222222','NAME', '0000') 

ID3 = User('333333','NAME', '0000') 

users = [ID1, ID2, ID3] 

main = Tk() 
main.title("Field Lookup") 
main.geometry('320x240') 

frame1 = Frame(main, height=300, width=200) 
frame1.pack() 

l1 = Label(frame1, text="Enter User ID") 
l1.pack() 

lst = StringVar() 

search_input = StringVar() 

entry = Entry(frame1, width=30, textvariable=search_input) 
entry.pack() 

l2 = Label(frame1, textvariable=lst) 
l2.pack(side=BOTTOM) 

def updt(): 
    main.update_idletasks() 

def search(): 
    for u in users: 
     if u.uid==search_input.get(): 
      lst.set(', '.join((u.uid,u.name,u.cc))) 
      updt() 

def clear(): 
    entry.delete(0, END) 
    lst.set('') 
    updt() 

button1 = Button(frame1, text="Search", command=search) 
button1.pack(side=LEFT) 

button2 = Button(frame1, text="Clear", command=clear) 
button2.pack(side=RIGHT) 

main.mainloop() 

Jetzt, nur um es hübsch zu machen. Alle Hilfe wurde sehr geschätzt.

Antwort

1

Einige kleinere Änderungen:

Sie müssen sich für textvariable einen StringVar als Wert zu übergeben.

lst = StringVar() 

Entfernen l2.configure(textvariable=lst). Updates auf lst aktualisiert den Text für das Etikett.

In clear(), setzen Sie lst auf eine leere Zeichenfolge.

lst.set('') 

In search() setzen lst auf das Ergebnis.

lst.set(','.join((u.uid,u.name,u.cc))) 
+0

Wenn ich versuche, lst = StringVar() zu setzen, gibt es mir den Fehler: Traceback (zuletzt letzten Aufruf): Datei "C: \ Pfad \ Python \ Scripts und Programme \ search_box.py", Zeile 24, in LST = StringVar() Datei "C: \ Pfad \ Python \ Python36-32 \ lib \ tkinter \ __ init__.py", Linie 477, in __init__ Variable .__ init __ (self, Master, den Wert, name) Datei "C: \ Pfad \ Python \ Python36-32 \ lib \ tkinter \ __ init__.py", Zeile 314, in __init__ self._root = master._root() AttributError: Objekt 'NoneType' hat kein Attribut '_root' – Cameron

+0

RE: Mein letzter Kommentar, das Problem war mit der Platzierung des Aufrufs stringvar(), wurde aufgerufen, bevor ich tk() aufgerufen. Aber ich habe immer noch das gleiche Problem; Mein Etikett wird nicht angezeigt. – Cameron

+0

'l2.configure (text = lst)' sollte 'l2.configure (textvariable = lst)' –

1

In Ihrer Funktion search iterieren Sie über users, die Klassenobjekte sind (ID1, etc.), und vergleichen Sie diese mit Ihrer Eingabe-String, der zu False wertet immer.

if u==search_input: sollte wirklich if u.uid == search_input: (oder u.name wenn Sie durch Namen suchen).

+0

Sie waren auf der richtigen Spur, aber auf der falschen Seite. Sie haben die korrekte Zeichenfolge ausgewertet, aber search_input kam als Objekt heraus, was durch den Aufruf von search_input.get() behoben wurde. – Cameron

Verwandte Themen