Creating an auto incrementing loop within a function in python

1.6k Views Asked by At

I'm trying to set up a loop that keeps track of a number of ordernums as well as assign a nw ordernum to each new order in increasing value.

Here's the full code:

*This is the fixed code using Klaus D. 's advice

import tkinter
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from itertools import count



class ImprintPlusApp:

    def __init__(self, master):
        self.counter = count(1)

        master.title("Imprint Plus Manager")

        self.frame_header = ttk.Frame(master)
        self.frame_header.pack()

        ttk.Label(self.frame_header, text = "Bienvenidos a Imprint Plus Manager")

        self.frame_crearorden = ttk.Frame(master)
        self.frame_crearorden.pack()

        ttk.Label(self.frame_crearorden, text = "Nombre").grid(row = 0, column = 0, padx = 5)
        ttk.Label(self.frame_crearorden, text = "Email").grid(row = 2, column = 0, padx = 5)
        ttk.Label(self.frame_crearorden, text = "Numero Cel/Tel").grid(row = 4, column = 0, padx = 5)
        ttk.Label(self.frame_crearorden, text = "Información Adicional").grid(row = 6, column = 0, padx = 5)

        self.entry_name = ttk.Entry(self.frame_crearorden, width = 24)
        self.entry_email = ttk.Entry(self.frame_crearorden, width = 24)
        self.entry_numtc = ttk.Entry(self.frame_crearorden, width = 24)
        self.entry_addinf = Text(self.frame_crearorden, width = 50, height = 10)

        self.entry_name.grid(row = 0, column = 1, padx = 5)
        self.entry_email.grid(row = 2, column = 1, padx = 5)
        self.entry_numtc.grid(row = 4, column = 1, padx = 5)
        self.entry_addinf.grid(row = 7, column = 0, columnspan = 2, padx = 5)

        ttk.Button(self.frame_crearorden, text = "Submit", command = self.submit).grid(row = 8, column = 1,columnspan = 1, padx = 5)
        ttk.Button(self.frame_crearorden, text = "Clear", command = self.clear).grid(row = 8, columnspan = 1, padx = 5)


    def submit(self):
        result = next(self.counter)
        orderResult = str(result)
        print ("Nombre: {}".format(self.entry_name.get()))
        print ("Email: {}".format(self.entry_email.get()))
        print ("Num Cel/Tel: {}".format(self.entry_numtc.get()))
        print ("Información Adicional: {}".format(self.entry_addinf.get(1.0, "end")))
        self.clear()


        messagebox.showinfo(title = "Orden #"+ orderResult, message = "Orden Guardada")

    def clear(self):
        self.entry_name.delete(0, "end")
        self.entry_email.delete(0, "end")
        self.entry_numtc.delete(0, "end")
        self.entry_addinf.delete(1.0, "end")


def main():

    root = Tk()
    app = ImprintPlusApp(root)
    root.mainloop()

if __name__ == '__main__':
    main() 
1

There are 1 best solutions below

6
On BEST ANSWER

You can use itertools.count() for that. It creates a generator, that just returns one number after the other, when you call it's next() method:

from itertools import count

counter = count(1)
for row in rows:
    row_id = counter.next()

In this example on every iteration through the rows you will get an other value for row_id, starting from the given argument (which was 1): 1, 2, 3, …

Generators an also be used in for loops directly:

for number in count(1):
    print(number)

This will fastly print a list of numbers.

In you class it would be a good idea to create the counter in __init__() and call next() when needed:

def __init__(self, master):
    self.counter = count(1)

    …(more code)…

def submit(self):
    my_id = self.counter.next()

    …(more code)…