Ich versuche ein Inventory System für ein Schulprojekt zu erstellen. Es soll Menschen erlauben, Lebensmittel in Kategorien einzutragen, die sie kreieren.Wie man ein Fenster in Tkinter nach dem Schließen eines anderen Fensters aktualisiert: Python 3.5
Ich habe Schwierigkeiten, das Fenster zu aktualisieren, das die Kategorien auflistet, denen 1 Nahrungsmittel hinzugefügt werden kann.
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
Dieser Code macht die Hauptschleife Switchy Switchy Sache.
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
Dies ist der Code für das Fenster, das eine neue Kategorie fügt auf dem addTab Fenster angezeigt.
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
Als ich den neuen Namen eingeben, tut es alles, was es angenommen hat, für Update außer der addTab mit der neuen Kategorie als Schaltfläche.
Eine Menge von dem, was ich im Internet gesucht habe, sagt, dass die Hauptschleife die "Ereignisbehandlung" oder Aktualisierung durchführt. Ich bin mir nicht sicher, was das bedeutet, besonders wenn viele Programme, die ich gesehen habe, alle ihre "Widgets" in der __init__
haben.
Ich versuche Python auf eigene Faust zu lernen und es geht anständig. Vieles davon ist wahrscheinlich schlecht (schrecklich) Programmieren und was nicht, aber es ist mein erster Ausflug in die Programmierung und ich bin bereit zu lernen.
Wenn jemand den vollen Code sehen möchte, kann ich es auch posten.
EDIT:
Hier ist der vollständige Code wie gewünscht:
import tkinter as tk
import os
filetuple = ('categorynames', 'barcodes')
for filename in filetuple:
fileopen = open(filename+'.txt','a')
fileopen.close
catnameopen = open('categorynames.txt','r').read().splitlines()
print(catnameopen)
for categoryname in catnameopen:
print(categoryname)
categoryamt = open(categoryname+'.txt','a')
categoryamt.close
if os.stat(categoryname+'.txt').st_size == 0:
categoryedit = open(categoryname+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
else:
print("not needed")
class MainMenu:
def __init__(self, master):
self.master = master
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.frame = tk.Frame(self.master)
self.addtabbutton = tk.Button(self.frame, text = 'ADD FOOD', width = 100, command = self.addtabwindow)
self.addtabbutton.pack()
self.subtabbutton = tk.Button(self.frame, text = 'SUBTRACT FOOD', width = 100, command = self.subtabwindow)
self.subtabbutton.pack()
self.quitbutton = tk.Button(self.frame, text = 'QUIT', width = 100, command = self.closewindow)
self.quitbutton.pack()
self.frame.pack()
def closewindow(self):
self.master.destroy()
def addtabwindow(self):
self.addtabwindow = tk.Toplevel(self.master)
self.app = AddTab(self.addtabwindow)
def subtabwindow(self):
self.subtabwindow = tk.Toplevel(self.master)
self.app = SubTab(self.subtabwindow)
class NewCategory:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 400, height = 240)
self.master.maxsize(width = 400, height = 240)
self.master.geometry('400x240+0+0')
self.label = tk.Label(self.frame, text = 'ADD NEW CATEGORY')
self.label.grid(row = 1, column = 1, columnspan = 2)
self.newcatentry = tk.Entry(self.frame, width = 50)
self.newcatentry.grid(row = 2, column = 1, columnspan = 2)
quitbutton = tk.Button(self.frame, text = 'QUIT', width = 25, command = self.closewindow)
quitbutton.grid(row = 3, column = 1)
enterbutton = tk.Button(self.frame, text = 'ENTER', width = 25, command = self.entryget)
enterbutton.grid(row = 3, column = 2)
self.frame.grid(row = 0, column = 0)
def entryget(self):
entrydata = self.newcatentry.get()
catnameopen = open('categorynames.txt','a')
catnameopen.write(entrydata+'\n')
catnameopen.close
catnamefile = open(entrydata+'.txt','a')
catnamefile.close
if os.stat(entrydata+'.txt').st_size == 0:
categoryedit = open(entrydata+'.txt', 'w')
categoryedit.write('0')
print('it worked')
categoryedit.close
print('derp')
self.master.destroy()
def closewindow(self):
self.master.destroy()
class AddTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'ADD TO CATEGORY')
self.label.pack(anchor = 'n')
self.frame.pack()
def loopstuff(self):
catnames = open('categorynames.txt','r').read().splitlines()
for name in catnames:
addbutton = tk.Button(self.frame, text = '+1 '+name, width = 20, command = lambda name = name: self.addtocategory(name))
addbutton.pack()
addnewcat = tk.Button(self.frame, text = 'ADD NEW CATEGORY', width = 100, command = self.addnewcategory)
addnewcat.pack(anchor = 's')
def addnewcategory(self):
self.addnewcategory = tk.Toplevel(self.master)
self.app = NewCategory(self.addnewcategory)
def addtocategory(self, name):
print(name)
nameamt = open(name+'.txt','r').read()
nameamt = int(nameamt) + 1
newamt = open(name+'.txt','w')
newamt.write(str(nameamt))
newamt.close
class SubTab:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.master.minsize(width = 800, height = 480)
self.master.maxsize(width = 800, height = 480)
self.master.geometry('800x480+0+0')
self.label = tk.Label(self.master, text = 'SUBTRACT FROM CATEGORY')
self.label.pack()
catnames = open('categorynames.txt','r').read().splitlines()
#for name in catnames:
#self.catnamebutton = tk.Button(self.frame, text = name, width = 30)
#self.catnamebutton.pack()
self.frame.pack()
def main():
root = tk.Tk()
app = MainMenu(root)
root.geometry('800x480+0+0')
root.mainloop()
if __name__ == '__main__':
main()
das Unter-Tab grundsätzlich ignoriert werden, da sie im Grunde eine Kopie von addTab sein werden.
Ich vermute, das Problem, das Sie haben, ist nicht in der Code, den Sie geschrieben haben. Sowohl 'NewCategory' als auch' AddTab' sind 'Frames' (auch sollten Sie Vererbung verwenden ... Python 3 C'mon). Das Problem, das Ihr Fragetitel beschreibt (über "Windows"), wäre von mehreren Tk 'Application's. Wo ist der Code von dir, der 'NewCategory' aufruft? Es wird wahrscheinlich etwas wie eine 'show()' irgendwo tun? – Tersosauros
@Tersosauros Ich habe den Beitrag aktualisiert, um den vollständigen Code zu enthalten. Ich habe PythonProgramming als meine Hauptressource für dieses Projekt sowie verschiedene Stackoverflow-Beiträge verwendet. Das Problem, das ich denke, ist, dass ich im Grunde die "for-Schleife" wiederholen muss, die die Tasten für jede Kategorie erstellt, ohne eine ganze Reihe von Tasten zusammen mit den alten Tasten zu erstellen. Der Code funktioniert einwandfrei, wenn ich das Fenster schließe und es wieder öffne. Danke für Ihre Hilfe! –