2016-03-27 6 views
2

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.

+0

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

+0

@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! –

Antwort

0

Sie zeigen den Code zum Erstellen einer AddTab-Instanz nicht an. Wie heißt es? Sie müssen auch eine addnewcategory() - Funktion in AddTab für den Befehl in der Schaltfläche drücken. Dieser Code fügt eine Schaltfläche außerhalb der Klasse hinzu, um zu zeigen, wie dies geschieht, und fügt jedes Mal, wenn Sie auf die Schaltfläche ADDNEWCATEGORY klicken, eine neue Schaltfläche hinzu. Offensichtlich ist dies nicht vollständig, da es keinen anderen Code enthält, sondern zeigt, wie der Knopfdruck funktioniert.

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

     ## separate frame for Add To Category button so 
     ## new buttons can be added to self.frame in order 
     self.cat_button_frame=tk.Frame(self.master) 

     self.label = tk.Label(self.master, text = 'ADD TO CATEGORY') 
     self.label.pack(anchor = 'n') 

     self.frame.pack() 
     self.cat_button_frame.pack() 
     self.but_num=1 
##  catnames = open('categorynames.txt','r').read().splitlines() 

     for name in ['a', 'b', 'c']: 
      addbutton = tk.Button(self.frame, text = '%s-%s ' %(self.but_num, name), 
            width = 20) 
      addbutton.pack() 
      self.but_num += 1 

     addnewcat = tk.Button(self.cat_button_frame, text = 'ADD NEW CATEGORY', 
        width = 100, command = self.addnewcategory) 
     addnewcat.pack(anchor = 's') 

    def addnewcategory(self): 
     """ for simplicity, new category is named "new cat" 
      and the button is not connected to any function 
     """ 
     tk.Button(self.frame, text = 'new cat-%d' %(self.but_num), width = 20).pack() 
     self.but_num += 1 

master=tk.Tk() 
AT=AddTab(master) 
## add new category from outside the class 
AT.addnewcategory() 
master.mainloop() 
Verwandte Themen