Swapnull
Swapnull

Reputation: 278

Tkinter displaying button instead of Label

I am creating a little app that will take in details from the user about a bank transaction and then display it in a table. I am currently using a CSV file to store the data and then when a new piece of data is put in, it will display that too.

I have a list of labels and then a button at the bottom of them to submit new entry. The problem I am getting is when the length of the table exceeds what it was to begin with there is a display error.

class accountant(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        master.title("Accountant")
        self.pack()
        self.numIncoming = 0
        self.numOutgoing = 0
        self.incoming = fs.fileStore("incoming", "csv")
        print("log: incoming.csv opened sucessfully")
        self.outgoing = fs.fileStore("outgoing", "csv")
        print("log: outgoing.csv opened sucessfully")
        self.setup()

    def setup(self):


        self.paint()
        self.incomingData()

        self.outgoingData()

        self.newEntryButtons()




    def paint(self): 
        tk.Label(self, width=45, text="incoming").grid(row=1, column=0, columnspan=45)
        tk.Label(self, width=45, text="outgoing").grid(row=1, column=45, columnspan=45)

        tk.Label(self, width=15, text="Date").grid(row=2, column=0, columnspan=15)
        tk.Label(self, width=15, text="Transaction Name").grid(row=2, column=15, columnspan=15)
        tk.Label(self, width=15, text="Amount").grid(row=2, column=30, columnspan=15)

        tk.Label(self, width=15, text="Date").grid(row=2, column=45, columnspan=15)
        tk.Label(self, width=15, text="Transaction Name").grid(row=2, column=60, columnspan=15)
        tk.Label(self, width=15, text="Amount").grid(row=2, column=75, columnspan=15)

    def incomingData(self):
        self.incoming.closeFile()
        self.incoming.openFile()

        i = 3
        for cell in self.incoming.reader:
        #cell[0] = Date, cell[1]= Transaction Name, cell[2] =amount
            tk.Label(self, width=15, text=cell[0]).grid(row=i, column=0, columnspan=15)
            tk.Label(self, width=15, text=cell[1]).grid(row=i, column=15, columnspan=15)
            tk.Label(self, width=15, text=cell[2]).grid(row=i, column=30, columnspan=15)
            i += 1

        self.numIncoming = i
        print("incoming:", self.numIncoming-3)  
        print("outgoing:", self.numOutgoing-3)


    def outgoingData(self):
        self.outgoing.closeFile()
        self.outgoing.openFile()
        i = 3
        for cell in self.outgoing.reader:
        #cell[0] = Date, cell[1]= Transaction Name, cell[2] =amount
            tk.Label(self, width=15, text=cell[0]).grid(row=i, column=45, columnspan=15)
            tk.Label(self, width=15, text=cell[1]).grid(row=i, column=60, columnspan=15)
            tk.Label(self, width=15, text=cell[2]).grid(row=i, column=75, columnspan=15)
            i += 1
        self.numOutgoing = i
        print("incoming:", self.numIncoming-3)
        print("outgoing:", self.numOutgoing-3, '\n\n')



    def newEntryButtons(self):
        if(self.numIncoming < self.numOutgoing):
            tk.Button(self, text="new incoming", width=45, command=lambda: self.newEntry(self.incoming)).grid(row=self.numOutgoing, column=0, columnspan=45)
            tk.Button(self, text="new outgoing", width=45, command=lambda: self.newEntry(self.outgoing)).grid(row=self.numOutgoing, column=45, columnspan=45)
        else:
            tk.Button(self, text="new incoming", width=45, command=lambda: self.newEntry(self.incoming)).grid(row=self.numIncoming, column=0, columnspan=45)
            tk.Button(self, text="new outgoing", width=45, command=lambda: self.newEntry(self.outgoing)).grid(row=self.numIncoming, column=45, columnspan=45)

    def newEntry(self, inFile):
        win = tk.Toplevel()

        self.newName = tk.StringVar()
        self.newDate = tk.StringVar()
        self.newAmount = tk.StringVar()


        tk.Label(win, width=5, text="Name:").grid(row=0, column=0, columnspan=5)
        tk.Entry(win, textvariable=self.newName).grid(row=0, column=5, columnspan=5)

        tk.Label(win, width=5, text="date:").grid(row=1, column=0, columnspan=5)
        tk.Entry(win, textvariable = self.newDate).grid(row=1, column=5, columnspan=5)

        tk.Label(win, width=5, text="amount: £").grid(row=2, column=0, columnspan=5)
        tk.Entry(win, textvariable=self.newAmount).grid(row=2, column=5, columnspan=5)

        button = tk.Button(win, text="submit", width=5, command= lambda: self.submit(win, inFile))
        button.grid(row=5, column=5, columnspan=5)

    def submit(self, win, inFile):
        with open(inFile.file, 'a') as f:
            string= '\n'+self.newName.get() + ',' + self.newDate.get() + ',' + self.newAmount.get()
            f.write(string)
        if inFile.fileName == "incoming":
            self.numIncoming += 1
        #   print("incoming:", self.numIncoming-3)
        #   print("outgoing:", self.numOutgoing-3)
        else:
            self.numOutgoing += 1
            print("outgoing:", self.numOutgoing-3)
        win.destroy()
        self.setup()

filestore is just a class that basically opens the csv using reader = csv.reader(open(file+'.'fileExt)) where file and fileExt are the parameters passed in.

Here is the image after a new entry. the bottom two buttons should stay as they are and the top two should be d e f in the left column and just whitespace in the right column Image after new entry

Upvotes: 1

Views: 137

Answers (1)

user1749431
user1749431

Reputation: 569

Replace self.pack() with self.grid(). To change a Label to Button you will, in addition, have to define a command function that executes when the Button is pressed, see the code below

bttn = tk.Button(self, text = "buttontitle",  command = self.do_function )
bttn.grid(row = 14, column = 4, sticky = W)


def do_function():
    print "HI"

Upvotes: 1

Related Questions