【问题标题】:Creating an auto incrementing loop within a function in python在python中的函数内创建一个自动递增循环
【发布时间】:2015-06-17 15:35:26
【问题描述】:

我正在尝试建立一个循环来跟踪订单编号的数量,并为每个新订单分配一个 nw 订单编号以增加值。

完整代码如下:

*这是使用 Klaus D. 建议的固定代码

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() 

【问题讨论】:

  • 问题是什么?也可能是mcve
  • 我的问题是,我怎样才能让 ordencount 变量跟踪创建的订单数量并为创建的每个新订单分配正确的订单数量?这样我就可以按订单号在列表中组织订单。
  • 您需要尝试自己解决逻辑,然后尝试对其进行编码。如果您的解决方案有问题,请询问这些问题。请阅读我在上面发布的 mcve 链接。
  • 如果您未能创建解决方案,请尝试解释您究竟在哪一部分失败了。例如。 “我记得其他语言的 for 循环,但我如何在 python 中做到这一点?”

标签: python loops tkinter increment


【解决方案1】:

您可以为此使用itertools.count()。它创建了一个生成器,当您调用它时,它只返回一个接一个的数字,它是 next() 方法:

from itertools import count

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

在此示例中,每次遍历行时,您都会从给定参数(1)开始获得 row_id 的另一个值:123、...

生成器也可以直接用于for 循环:

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

这将快速打印出一个数字列表。

在您的课堂上,最好在__init__() 创建计数器并在需要时调用next()

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

    …(more code)…

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

    …(more code)…

【讨论】:

  • 这种方法看起来很有希望,因为我以前没有想到过。问题是当我执行代码时出现错误。这个错误是:AttributeError: 'itertools.count' object has no attribute 'next'
  • 你到底执行了什么?回溯是什么?
  • 回溯(最近一次调用最后):文件“/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py”,第 1533 行,在 call return self.func(*args) File "/Users/mariorivera/Documents/Aptana Studio 3 Workspace/Test1/Contents/GUI.py",第 44 行,在提交结果中 = self.counter.next( ) AttributeError: 'itertools.count' 对象没有属性 'next'
  • self.counter = count(1) 是否应该在 next() 中?像这样:next(self.counter)
  • 是的,我给出的代码是针对 Python 2 的,正如我所见,您正在运行 Python 3:所以它是 my_id = next(self.counter)
猜你喜欢
  • 1970-01-01
  • 2016-10-17
  • 2012-10-22
  • 2021-08-05
  • 2012-12-30
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2020-11-27
相关资源
最近更新 更多