我目前正在构建一个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]]
这是启动时发生的事情。
这就是我想要的,它看起来不错(对于一个非常基本的构建)并显示我想要的东西。但是,按下" 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()
然而,当窗口关闭时(在输入这样的信息之后)
原始文本框中的文字根本没有更新。我让程序打印了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()
答案 0 :(得分:1)
您无法创建Tk
的多个实例。您的程序应始终只有一个实例,您应该只调用mainloop()
一次。如果您需要更多窗口,请创建Toplevel
。