Tkinter Inventory

Fragen zu Tkinter.
Antworten
Maxi244244
User
Beiträge: 2
Registriert: Montag 8. Juni 2015, 17:59

Hallo ich arbeite seit ca. einer Woche an einem Inventarprogramm bei dem man Artikel eingeben, bearbeiten,... kann.
Ich hätte gerne dass es den Gesamtpreis eines Artikels berechnet aus der menge multipliziert mit dem Einzelpreis.

In line 82 habe ich dies versucht bitte um Hilfe!

PS: Ich benutze Python 2.7.10

Code: Alles auswählen

# -*- coding: cp1252 -*-


from Tkinter import *
from tkMessageBox import *
from MultiListBox import MultiListbox
import shelve

shelvename = "inventory.slv"

class ProductEntry(Frame):
    """Interface for product entry."""
    
    def __init__(self, parent = None):
        """Create, pack, and bind entry boxes and buttons for product entry."""
        
        Frame.__init__(self)
        self.pack()
        self.master.title("Inventar Programm")
        
        #---Anleitung
        self.instructionFrame = Frame(self)
        self.instructionFrame.pack()
        
        Label(self.instructionFrame, text = "Bitte die Felder ausfüllen und auf 'Hinzufügen' drücken um ein Produkt ein zu tragen").pack()
        
        #---Eingabefelder
        self.entryFrame = Frame(self)
        self.entryFrame.pack()
        
        #---Überschriften
        self.col1 = Label(self.entryFrame, text = "Artikelnummer")
        self.col1.grid(row = 0, column = 0)
        
        self.col2 = Label(self.entryFrame, text = "Artikel")
        self.col2.grid(row = 0, column = 1)
        
        self.col3 = Label(self.entryFrame, text = "Beschreibung")
        self.col3.grid(row = 0, column = 2)
        
        self.col4 = Label(self.entryFrame, text = "Menge")
        self.col4.grid(row = 0, column = 3)
        
        self.col5 = Label(self.entryFrame, text = "Einzelpreis")
        self.col5.grid(row = 0, column = 4)
        
        #self.col6 = Label(self.entryFrame, text = "Gesamtpreis")
        #self.col6.grid(row = 0, column = 5)
        
        #---Entry boxes
        self.artNum = Entry(self.entryFrame, name = "artNum")
        self.artNum.grid(row = 1, column = 0)
        
        self.artikel = Entry(self.entryFrame, name = "artikel")
        self.artikel.grid(row = 1, column = 1)
        
        self.beschreibung = Entry(self.entryFrame, name = "beschreibung")
        self.beschreibung.grid(row = 1, column = 2)
        
        self.menge = Entry(self.entryFrame, name = "menge")
        self.menge.grid(row = 1, column = 3)
        
        self.einzelpreis = Entry(self.entryFrame, name = "einzelpreis")
        self.einzelpreis.grid(row = 1, column = 4)
        
        #self.gesamtpreis = Entry(self.entryFrame, name = "gesamtpreis")
        #self.gesamtpreis.grid(row = 1, column = 5)
        
        #---Produkt Eingabefeld
        self.entryBtnFrame = Frame(self)
        self.entryBtnFrame.pack()
        
        self.newEntryBtn = Button(self.entryBtnFrame, text = "Produkt hinzufügen",
            command = self.clickNewEntry)
        self.newEntryBtn.pack(side = LEFT)
        
        
    
    def clickNewEntry(self):
        """Get all entry boxes and write to inventory database."""

        self.gesamtpreis =  int(self.menge) * self.einzelpreis
        self.key = self.artNum.get()
        self.record = [self.artikel.get(), self.beschreibung.get(), self.menge.get(),
            self.einzelpreis.get(), self.gesamtpreis.get()]
        
        self.writeShelf(self.key, self.record)
        
        
        self.artNum.delete(0, END)
        self.artikel.delete(0, END)
        self.beschreibung.delete(0, END)
        self.menge.delete(0, END)
        self.einzelpreis.delete(0, END)
        #self.gesamtpreis.delete(0, END)
        
            
    
    def writeShelf(self, key, record):
        """Opens DB, writes entries, then closes DB."""
        
        self.database = shelve.open(shelvename)
        self.database[self.key] = self.record
        self.database.close()
    
class ProductDisplay(Frame):
    """Interface for product display"""
    
    def __init__(self, parent = None):
        """Create, pack, and bind entry boxes and buttons for product display"""
        
        Frame.__init__(self)
        self.pack()
        
        self.frameHeading = Frame(self)
        self.frameHeading.pack()
        
        self.frameHeadingTitle = Label(self.frameHeading, text = "Inventar",bg = "lightblue",
            font = ("Arial", "28", "bold"))
        self.frameHeadingTitle.pack()      
        
        
        self.showInventoryFrame = Frame(self).pack()
        
        
        ##Imported table-like multilist box
        self.listBox = MultiListbox(self.showInventoryFrame, (("Artikelnummer", 5), 
            ("Artikel", 20), ("Beschreibung", 40), ("Menge", 5), ("Einzelpreis", 5)
            , ("Gesamtpreis", 5)))
        
        self.listBox.pack(expand = YES, fill = BOTH)
        
        
        
        #---Inventory display buttons
        self.inventoryBtnFrame = Frame(self).pack()
        self.fetchInven = Button(self.inventoryBtnFrame, text = "Aktualisieren",
            command = self.getInven)
        self.fetchInven.pack(side = LEFT)
        
        self.modifyInven = Button(self.inventoryBtnFrame, text = "Produkt bearbeiten",
            command = self.changeInven)
        self.modifyInven.pack(side= LEFT)
        
        self.deleteInven = Button(self.inventoryBtnFrame, text = "Produkt löschen",
            command = self.clearEntry)
        self.deleteInven.pack(side = LEFT)
        
        self.clearInven = Button(self.inventoryBtnFrame, text = "Inventar leeren",
            command = self.delInven)
        self.clearInven.pack(side = LEFT)
    
    def getInven(self):
        """Gets products from DB and displays them.
        
        Opens the shelve, loops through each entry, prints the unpacked tuple
        for each record, then closes the shelve."""
        
        self.listBox.delete(0, END)
        self.productList = shelve.open(shelvename)
        for item in self.productList.keys():
            (self.artik, self.beschreib, self.meng, self.einzelp, 
                self.gesamtp) = self.productList[item]
            
            self.listBox.insert(END, (item, self.artik, self.beschreib, self.meng,
                self.einzelp, self.gesamtp))
        self.productList.close()
    
    def clearEntry(self):
        """Deletes an entry from the database.
        
        Gets the highlighted selection, makes a list of the the separate words,
        'pops' the product number entry, finds the product number in the shelve,
        deletes the product, then updates the inventory screen."""
        
        ans = askokcancel("Produkt löschen", "Soll das ausgewählte Produkt wirklich gelöscht werden?")   #popup window
        if ans:
            self.productList = shelve.open(shelvename)
            
            self.getSelection = self.listBox.curselection() #get index of selection
            
            self.selectedEntry = self.listBox.get(self.getSelection)    #get tuple from selection
            
            (self.productNum, self.artik, self.beschreib, self.meng, self.einzelp, 
                self.gesamtp) = self.selectedEntry    #unpack tuple
            self.entry = self.selectedEntry[0]
            del self.productList[self.entry]
            self.productList.close()
            showinfo(title = "Produkt entfernt",
                message = "Das Produkt wurde vom Inventar entfernt.")
            self.getInven()

    def changeInven(self):
        """Allows modification of a database entry.
        
        Called by modifyInven Button"""
        
        try:    
            self.getSelection = self.listBox.curselection() #get index of selection
            self.selectedEntry = self.listBox.get(self.getSelection)    #get tuple from selection
            (self.artNum, self.artik, self.beschreib, self.meng, self.einzelp, 
                self.gesamtp) = self.selectedEntry    #unpack tuple
            
            self.editWindow = Toplevel()    
            self.editWindow.title("Gewähltes Produkt bearbeiten")
            
            #---Edit product window widgets
            Label(self.editWindow, text = "Artikelnummer").grid(row = 0, column = 0)
            Label(self.editWindow, text = "Artikel").grid(row = 0, column = 1)
            Label(self.editWindow, text = "Beschreibung").grid(row = 0, column = 2)
            Label(self.editWindow, text = "Menge").grid(row = 0, column = 3)
            Label(self.editWindow, text = "Einzelpreis").grid(row = 0, column = 4)
            Label(self.editWindow, text = "Gesamtpreis").grid(row = 0, column = 5)
            
            self.oldNum = Entry(self.editWindow, name = "artNum")
            self.oldNum.grid(row = 1, column = 0)
            self.oldartik = Entry(self.editWindow, name = "artik")
            self.oldartik.grid(row = 1, column = 1)
            self.oldBeschreib = Entry(self.editWindow, name = "beschreib")
            self.oldBeschreib.grid(row = 1, column = 2)
            self.oldMeng = Entry(self.editWindow, name = "meng")
            self.oldMeng.grid(row = 1, column = 3)
            self.oldEinzelp = Entry(self.editWindow, name = "einzelp")
            self.oldEinzelp.grid(row = 1, column = 4)
            self.oldGesamtp = Entry(self.editWindow, name = "gesamtp")
            self.oldGesamtp.grid(row = 1, column = 5)
            
            self.update = Button(self.editWindow, text = "Produkt bearbeiten",
                command = self.updateProduct).grid(row = 2, column = 2)
            self.cancel = Button(self.editWindow, text = "Abbrechen",
                command = self.cancelProduct).grid(row = 2, column = 3)
            
            #Label(self.editWindow, 
            #    text = "This dialog only updates the prices and quantity.").grid(row = 
           
            #---Edit product data
            self.oldNum.insert(END, self.artNum)
            self.oldartik.insert(END, self.artik)
            self.oldBeschreib.insert(END, self.beschreib)
            self.oldMeng.insert(END, self.meng)
            self.oldEinzelp.insert(END, self.einzelp)
            self.oldGesamtp.insert(END, self.gesamtp)
            
            
        except TclError:    
            showerror(title = "Fehler!", message = "Kein Produkt ausgewählt!")
            
    
    def updateProduct(self):
        """Change the values of a database entry.
        
        Called by changeInven Button."""
        
        self.productList = shelve.open(shelvename)
        self.oldEntry = self.oldNum.get()
       
        self.newMeng = self.oldMeng.get()
        self.newEinzelp = self.oldEinzelp.get()
        self.newGesamtp = self.oldGesamtp.get()
       
        self.newRecord = [self.artik, self.beschreib,
            self.newMeng, self.newEinzelp, self.newGesamtp]
        
        self.productList[self.oldEntry] = self.newRecord
        
        self.productList.close()
        self.editWindow.destroy()
    
    def cancelProduct(self):
        """Verify canceling of product update."""
        
        self.editWindow.destroy()
    
    def delInven(self):
        """Deletes all entries in database."""
        
        ans = askokcancel("Inventar löschen", "Soll das gesamte Inventar wirklich gelöscht werden?")   
        if ans: 
            self.productList = shelve.open(shelvename)
            self.productList.clear()
            self.productList.close()
            showinfo(title = "Inventar gelöscht",
                message = "Das gesamte Inventar wurde gelöscht.")

def main():
    
    root = Tk()
    root.geometry("900x500+150+100")
    entry = ProductEntry(root)
    display = ProductDisplay(root)
    entry.pack()
    display.pack()
    root.mainloop()
    
    
if __name__ == "__main__":
    main()
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

self.menge erstellst du in Zeile 60. Es ist ein Entry. Da musst du den Inhalt rausholen, um damit rechnen zu könne . Das macht man afaik mit .get

Und nächstes Mal bitte weniger Code, und die Fehlermeldung posten.
PS: Die angebotene Summe ist beachtlich.
Antworten