Tkinter Inventory
Verfasst: Montag 15. Juni 2015, 17:02
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
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()