Entry Eingabe beschränken

Fragen zu Tkinter.
Antworten
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Guten Tag,
ich möchte das man in alle Tk.Entrys nur positive ganze Zahlen eintippen kann.
Ich weiß nicht was ich bei der Methode vor das register eintragen soll.
Programm, Tk, root und tk gehen nicht.
Es geht um die Methode only_numbers.

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
        self.title("Test Ablaufprogramm")
        
        self.wiederholungen = tk.IntVar(self, 5)
        
        self.runde = tk.IntVar(self, 5)
        
        self.arbeit = tk.IntVar(self, 7)
   
        self.pause = tk.IntVar(self, 10)
        
        self.ausgabe = tk.StringVar(self, "Ausgabe")
        
        self.ausgabe_mitte = tk.StringVar(self, "")
        
        tk.Label(self, text='Wiederholungen:').grid(row= 0,column = 1 )
        
        tk.Entry(self,width=5, textvariable=self.wiederholungen).grid(row=0, column=2)
        
        tk.Label(self, text='Runden:').grid(row=0,column=3)
        
        tk.Entry(self,width=5, textvariable=self.runde).grid(row=0, column=4)
        
        tk.Label(self, text='Arbeit:').grid(row=0,column=5)
        
        tk.Entry(self,width=5, textvariable=self.arbeit).grid(row=0, column=6)
        
        tk.Label(self, text='Pause:').grid(row=0,column=7)
        
        tk.Entry(self,width=5, textvariable=self.pause).grid(row=0, column=8)
        
        tk.Label(self, textvariable=self.ausgabe).grid(row=2,columnspan=10)
        
        self.label_mitte = tk.Label(self,height = 10, width= 40, bg= 'green', textvariable = self.ausgabe_mitte, font = ("Arial", 20))
        self.label_mitte.grid(row=3, columnspan=10)
        
        self.button_start = tk.Button(self, text="Start", width=10, command=self.start)
        self.button_start.grid(row=4, columnspan=10)
     
        self.zählerWiederholungen = 0
        
    def only_numbers(char):
        return char.isdigit()

    validation = root.register(only_numbers)
        
    def start(self):
        if self.button_start["state"] == "active":
            self.button_start["state"] = "disabled"
        else:
            self.button_start["state"] = "active"
        if self.zählerWiederholungen < self.wiederholungen.get() and self.zählerWiederholungen == 0:
            self.zählerWiederholungen += 1
            self.zählerRunde = 0
            self.zählerArbeit = 0
            self.zählerPause = 0
            self.rundenstart()
        elif self.zählerWiederholungen < self.wiederholungen.get() and self.zählerWiederholungen > 0:
            self.zählerWiederholungen += 1
            self.zählerRunde = 0
            self.zählerArbeit = 0
            self.zählerPause = 0
            self.zählerUni = 0
            self.zählerGlobal("Pause", 120)
        else:
            self.ausgabe.set("Ausgabe")

    def rundenstart(self):
        if self.zählerRunde <= self.runde.get() and self.zählerArbeit == self.zählerPause:
            self.zählerRunde += 1
            self.zählerUni = 0
            self.zählerGlobal("Arbeit", self.arbeit.get())
            self.zählerArbeit += 1
        elif self.zählerRunde < self.runde.get() and self.zählerArbeit > self.zählerPause:
            self.zählerUni = 0
            self.zählerGlobal("Pause", self.pause.get())
            self.zählerPause += 1      
        elif self.zählerRunde == self.runde.get() and self.zählerArbeit > self.zählerPause:
            self.start()
            
            
    def zählerGlobal(self, text, Zeit):
        self.ausgabe.set(f"Wiederholung: {self.zählerWiederholungen} / {self.wiederholungen.get()} Runde: {self.zählerRunde} / {self.runde.get()} {text} {self.zählerUni+1} / {Zeit}")
        self.zählerUni += 1
        if text == "Arbeit":
            self.label_mitte.config(bg='red')
            self.ausgabe_mitte.set(Zeit+1-self.zählerUni)
        elif text == "Pause":
            self.label_mitte.config(bg='green')
            self.ausgabe_mitte.set(Zeit+1-self.zählerUni)
        arr1 = text
        arr2 = Zeit
        if self.zählerUni < Zeit+1:
            self.after(1000, self.zählerGlobal, arr1, arr2)
        else:
            self.rundenstart()           

def main():
    root = Programm()
    root.mainloop()
    
if __name__ == "__main__":
    main()
 
Gruß Kai
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Habe es jetzt so hinbekommen, wirklich schön ist das aber nicht ...
Verstehen was da passiert tue ich auch nicht wirklich.

Code: Alles auswählen

import tkinter as tk

class Programm(tk.Tk):
    
    def __init__(self):
        super().__init__()
        
        self.title("Test Ablaufprogramm")
        
        self.wiederholungen = tk.IntVar(self, 5)
        
        self.runde = tk.IntVar(self, 5)
        
        self.arbeit = tk.IntVar(self, 7)
   
        self.pause = tk.IntVar(self, 10)
        
        self.ausgabe = tk.StringVar(self, "Ausgabe")
        
        self.ausgabe_mitte = tk.StringVar(self, "")

        validation = (self.register(self.only_numbers),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        
        tk.Label(self, text='Wiederholungen:').grid(row= 0,column = 1 )
        
        tk.Entry(self,width=5, textvariable=self.wiederholungen, validate = 'key', validatecommand = validation).grid(row=0, column=2)
        
        tk.Label(self, text='Runden:').grid(row=0,column=3)
        
        tk.Entry(self,width=5, textvariable=self.runde, validate = 'key', validatecommand = validation).grid(row=0, column=4)
        
        tk.Label(self, text='Arbeit:').grid(row=0,column=5)
        
        tk.Entry(self,width=5, textvariable=self.arbeit, validate = 'key', validatecommand = validation).grid(row=0, column=6)
        
        tk.Label(self, text='Pause:').grid(row=0,column=7)
        
        tk.Entry(self,width=5, textvariable=self.pause, validate = 'key', validatecommand = validation).grid(row=0, column=8)
        
        tk.Label(self, textvariable=self.ausgabe).grid(row=2,columnspan=10)
        
        self.label_mitte = tk.Label(self,height = 10, width= 40, bg= 'green', textvariable = self.ausgabe_mitte, font = ("Arial", 20))
        self.label_mitte.grid(row=3, columnspan=10)
        
        self.button_start = tk.Button(self, text="Start", width=10, command=self.start)
        self.button_start.grid(row=4, columnspan=10)
     
        self.zählerWiederholungen = 0
        
    def only_numbers(self, action, index, value_if_allowed,
                       prior_value, text, validation_type, trigger_type, widget_name):
        if value_if_allowed:
            try:
                float(value_if_allowed)
                return True
            except ValueError:
                return False
        else:
            return False

    def start(self):
        if self.button_start["state"] == "active":
            self.button_start["state"] = "disabled"
        else:
            self.button_start["state"] = "active"
        if self.zählerWiederholungen < self.wiederholungen.get() and self.zählerWiederholungen == 0:
            self.zählerWiederholungen += 1
            self.zählerRunde = 0
            self.zählerArbeit = 0
            self.zählerPause = 0
            self.rundenstart()
        elif self.zählerWiederholungen < self.wiederholungen.get() and self.zählerWiederholungen > 0:
            self.zählerWiederholungen += 1
            self.zählerRunde = 0
            self.zählerArbeit = 0
            self.zählerPause = 0
            self.zählerUni = 0
            self.zählerGlobal("Pause", 120)
        else:
            self.ausgabe.set("Ausgabe")

    def rundenstart(self):
        if self.zählerRunde <= self.runde.get() and self.zählerArbeit == self.zählerPause:
            self.zählerRunde += 1
            self.zählerUni = 0
            self.zählerGlobal("Arbeit", self.arbeit.get())
            self.zählerArbeit += 1
        elif self.zählerRunde < self.runde.get() and self.zählerArbeit > self.zählerPause:
            self.zählerUni = 0
            self.zählerGlobal("Pause", self.pause.get())
            self.zählerPause += 1      
        elif self.zählerRunde == self.runde.get() and self.zählerArbeit > self.zählerPause:
            self.start()
            
            
    def zählerGlobal(self, text, Zeit):
        self.ausgabe.set(f"Wiederholung: {self.zählerWiederholungen} / {self.wiederholungen.get()} Runde: {self.zählerRunde} / {self.runde.get()} {text} {self.zählerUni+1} / {Zeit}")
        self.zählerUni += 1
        if text == "Arbeit":
            self.label_mitte.config(bg='red')
            self.ausgabe_mitte.set(Zeit+1-self.zählerUni)
        elif text == "Pause":
            self.label_mitte.config(bg='green')
            self.ausgabe_mitte.set(Zeit+1-self.zählerUni)
        arr1 = text
        arr2 = Zeit
        if self.zählerUni < Zeit+1:
            self.after(1000, self.zählerGlobal, arr1, arr2)
        else:
            self.rundenstart()           

def main():
    root = Programm()
    root.mainloop()
    
if __name__ == "__main__":
    main()
        
   
        
        
Antworten