Mir wurde geraten, für TKinter eine eigene Klasse anzulegen, was ich nun gemacht habe. Nun soll wie vorher das "Entry"-Feld ausgelesen werden, wenn jemand etwas eingibt und mit <RETURN> abschließt.
Hierfür gibt es dieses Binding:
Code: Alles auswählen
entryField.focus()
entryField.bind('<Return>', self.getscan())
Somit wird die Funktion <getscan> aufgerufen, die die Eingabe in Großschrift umwandelt und in die Variable <entry> speichert:
Code: Alles auswählen
def getscan(self):
self.entry = str.upper(self.entryField.get)
print(self.entry)
Wie ist es möglich, auf das Entry-Feld zuzugreifen? Entweder von außerhalb der Klasse oder innerhalb der Klasse in einer anderen Funktion?
Da ich mich erst an die objektorientierte Programmierung gewöhnen muss, liegt der Fehler sicher hier?
Thema am Rande: Ich möchte zum automatischem Update des Labels die Stringvar-Variante von TKinter nutzen.
Das Label soll also immer die Eingabe des Entry-Felds (abgeschlossen mit Return) anzeigen. Auch hier hatte ich schon diverse Probleme, dass es nicht funktioniert.
Mache ich hier auch etwas falsch?
Danke für eure Hilfe im Voraus. Trotz mehrerer Bücher und Google komme ich zu keinem schnellen Ergebnis.
P.S.: Das ist eine konkrete Aufgabe, für die ich eine Deadline habe. Parallel dazu versuche ich, mich gründlich und intensiv in Python und OOP einzuarbeiten, doch das dauert natürlich lange.
Hier der gesamte Quelltext. Die Funktion der Buttons könnt ihr ignorieren, den Code für die Funktionen habe ich aufgrund der Übersichtlichkeit herausgelöscht.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial, partialmethod
'''
class CONTROL():
def __init__(self):
def getscan(self):
print("getscanfunction")
GUI.seriallabeltext.set = str.upper(GUI.entryField.get())
GUI.entryField.delete(0, 100)
print(GUI.seriallabeltext.get())
'''
class GUI(tk.Canvas):
def __init__(self, master, entry):
super().__init__(master)
self.entry = entry
#Text für Labels, TKINTER spezielle Stringvariablen, um Label automatisch upzudaten, wenn sich diese ändert
self.seriallabeltext = tk.StringVar() #Binding variable
self.seriallabeltext.set("-")
self.statuslabeltext = tk.StringVar() # Binding variable
self.statuslabeltext.set("Enter code")
#CREATE GUI LAYOUT, LABELS, BUTTONS and ENTRY FIELD
canvas_front = tk.Canvas(self, height=480, width=800)
canvas_front.pack()
frame = tk.Frame(canvas_front, bg='#00cc99')
frame.place(anchor='nw', height=480, width=800)
label_top = tk.Label(frame, text="v0.1", bg='white', fg='#00cc99')
label_top.place(relx=0, rely=0, relwidth=1, relheight=0.10)
label_status = tk.Label(frame, textvariable=self.statuslabeltext, font=('Arial', 24), bg='white', fg='#00cc99', highlightbackground='black', borderwidth=1, relief='solid', wraplength=500)
label_status.place(relx=0.3, rely=0.10, relwidth=0.7, relheight=0.45)
label_serial = tk.Label(frame, textvariable=self.seriallabeltext, font=('Arial', 24), bg='white', fg='#00cc99', highlightbackground='black', borderwidth=1, relief='solid', wraplength=500)
label_serial.place(relx=0.3, rely=0.55, relwidth=0.7, relheight=0.45)
button_repeat = tk.Button(frame, text="Repeat Scan", font=('Arial', 16), bg='#00cc99', fg='white', activebackground='#00cc99', activeforeground='white', command=lambda: updatelabels('RepeatScan', 'Please scan', 'full'))
button_sample = tk.Button(frame, text="Test sample", font=('Arial', 16), bg='#00cc99', fg='white', activebackground='#00cc99', activeforeground='white', command=lambda: changelabelcolor('green', 'blue'))
button_repeat.place(relx=0.00, rely=0.10, relwidth=0.3, relheight=0.45)
button_sample.place(relx=0.00, rely=0.55, relwidth=0.3, relheight=0.45)
#entry field
entryField = tk.Entry(frame, font=('Arial', 24), bg='white', fg='#00cc99', highlightbackground='black', justify='center', borderwidth=1, relief='solid')
entryField.place(relx=0.35, rely=0.35, relwidth=0.6, relheight=0.15)
entryField.focus()
entryField.bind('<Return>', self.getscan())
def getscan(self):
self.entry = str.upper(self.entryField.get)
print(self.entry)
#entryField.lower() #place entry field behind main window (hide it, result will be displayed in Label)
def main():
'''
Um tkinter zu initialisieren, muss ein ROOT-Widget erzeigt werden.
Dies geschieht mit dem Aufruf Tk().
Das Root-Widget muss erzeugt werden, bevor irgendwelche anderen Widgets benutzt werden.
Es kann in jeder Anwendung nur ein Root-Widget geben.
'''
root = tk.Tk()
eingabe = " "
root.title("GUI")
root.config(cursor='none')
#root.attributes('-fullscreen', True)
gui = GUI(root, eingabe)
gui.pack()
root.mainloop()
if __name__ == "__main__":
main()