使用迭代列表

时间:2015-08-21 10:33:24

标签: python tkinter

我目前正在构建一个Python应用程序,可让您跟踪付款情况。我选择使用Tkinter UI,因为它不会被那些对编程知识渊博的人使用。

在按照 zetcode 上的教程后,我创建了一个名为Main的类:

class Main(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent, background="#554433")
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Simple")
        self.pack(fill=BOTH, expand=1)

        self.outgoingsString = StringVar()
        self.addOnString = gatherList()

        self.outgoingsList = Label(self, textvariable=self.outgoingsString, font = ["Verdana", 20], foreground = "#1F3424").pack()
        self.outgoingsString.set(self.addOnString)

        quitButton = Button(self, text="Add", command=addListItem)
        quitButton.place(x=20, y=360)

gatherlist()是我写的一个函数,它迭代列表列表以生成将在启动时看到的内容:

def gatherList():
    newString = ""
    for x in range(0, len(listOfOutgoingPayments)):
        newString += ("Name: " + listOfOutgoingPayments[x][0] + " | Money: " + str(listOfOutgoingPayments[x][1]) + "\n")
        int(listOfOutgoingPayments[x][1])

    print(newString)
    return newString

listOfOutgoingPayments是一个列表,默认情况下包含以下内容: [["TV", 20]]

这是启动时发生的事情。

This is what happens upon startup.

这就是我想要的,它看起来不错(对于一个非常基本的构建)并显示我想要的东西。但是,按下" Add"启动另一个GUI,这是一个名为ListItem的类:

class ListItem(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent, background="#334455")
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Simple")
        self.pack(fill=BOTH, expand=1)

        self.nameEntry = Entry(self)
        self.nameEntry.pack()

        self.submitNameEntry = Button(self, text="Submit Name", command=self.getTextName)
        self.submitNameEntry.pack()

        self.moneyEntry = Entry(self)
        self.moneyEntry.pack()

        self.submitMoneyEntry = Button(self, text="Submit Money", command=self.getTextMoney)
        self.submitMoneyEntry.pack()

        self.submitButton = Button(self, text="Finish and Submit", command=self.finish)
        self.submitButton.pack()

    def getTextName(self):
        self.nameOfListItem = self.nameEntry.get()
        print(self.nameOfListItem)

    def getTextMoney(self):
        self.amountOfMoney = self.moneyEntry.get()
        print(self.amountOfMoney)

    def finish(self):
        listOfOutgoingPayments.append([self.nameOfListItem, self.amountOfMoney])
        gatherList()
        self._close()

    def _close(self):
        self.master.destroy()

然而,当窗口关闭时(在输入这样的信息之后)

The next window that appears upon clicking <code>Add</code>

原始文本框中的文字根本没有更新。我让程序打印了listOfOutgoingPayments已更新的内容,以及刚刚输入的所有正确信息。

我认为该窗口需要更新,因此在finish(self)课程的ListItem我添加了root.initUI(),但我得到了AttributeError: 'tkapp' object has no attribute 'initUI'

任何人都可以对问题有所了解并可能帮助解决问题吗? 任何帮助表示感谢,谢谢。

编辑:

函数addListItem如下:

def addListItem():
    itemAdd = Tk()
    itemAdd.geometry("150x150")
    addItem = ListItem(itemAdd)
    itemAdd.mainloop()

1 个答案:

答案 0 :(得分:1)

您无法创建Tk的多个实例。您的程序应始终只有一个实例,您应该只调用mainloop()一次。如果您需要更多窗口,请创建Toplevel

的实例