0
global Num1
from Tkinter import *
Num1 = ""
def buttonNPush(n):
    global Num1
    Num1 = Num1+n
    print Num1
def clearScr():
    global Num1
    Num1 = ""
    
root = Tk()
textbox = Entry(root)
textbox.pack(side=TOP)
#Create Frame with buttons numbered 0-9
frameButtons = Frame(root)
frameButtons.pack(side=LEFT)
button1 = Button(frameButtons, text="1", command=buttonNPush("1"))
button1.grid(row=0, column=0)
button2 = Button(frameButtons, text="2", command=buttonNPush("2"))
button2.grid(row=0, column=1)
button3 = Button(frameButtons, text="3", command=buttonNPush("3"))
button3.grid(row=0, column=2)
button4 = Button(frameButtons, text="4", command=buttonNPush("4"))
button4.grid(row=1, column=0)
button5 = Button(frameButtons, text="5", command=buttonNPush("5"))
button5.grid(row=1, column=1)
button6 = Button(frameButtons, text="6", command=buttonNPush("6"))
button6.grid(row=1, column=2)
button7 = Button(frameButtons, text="7", command=buttonNPush("7"))
button7.grid(row=2, column=0)
button8 = Button(frameButtons, text="8", command=buttonNPush("8"))
button8.grid(row=2, column=1)
button9 = Button(frameButtons, text="9", command=buttonNPush("9"))
button9.grid(row=2, column=2)
button0 = Button(frameButtons, text="0", command=buttonNPush("0"))
button0.grid(row=3, column=0)
buttonClear = Button(frameButtons, text="C", command=clearScr)
buttonClear.grid(row=4, column=0)
root.mainloop()

It just prints:

1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890

How do I make it wait until I press the buttons to add the numbers to the string. The buttons also don't run the event that they are meant to run.

4
Contributors
4
Replies
7
Views
9 Years
Discussion Span
Last Post by vegaseat
0

Two bad things stick out right away from your code:

1) Don't mix Tkinter geometry managers pack and grid within the same frame.

2) Command accepts a function reference not a function call. To pass an argument use lambda, a closure, or the new partial function (Python25).

Take a look at:
http://www.daniweb.com/code/snippet610.html

That snippet uses a lambda function to pass the argument (button value).

0
global Num1
from Tkinter import *
Num1 = ""
def buttonNPush(n):
    global Num1
    Num1 = Num1+n
    print Num1
def clearScr():
    global Num1
    Num1 = ""
    
root = Tk()
textbox = Entry(root)
textbox.pack(side=TOP)
#Create Frame with buttons numbered 0-9
frameButtons = Frame(root)
frameButtons.pack(side=LEFT)
button1 = Button(frameButtons, text="1", command=buttonNPush("1"))
button1.grid(row=0, column=0)
button2 = Button(frameButtons, text="2", command=buttonNPush("2"))
button2.grid(row=0, column=1)
button3 = Button(frameButtons, text="3", command=buttonNPush("3"))
button3.grid(row=0, column=2)
button4 = Button(frameButtons, text="4", command=buttonNPush("4"))
button4.grid(row=1, column=0)
button5 = Button(frameButtons, text="5", command=buttonNPush("5"))
button5.grid(row=1, column=1)
button6 = Button(frameButtons, text="6", command=buttonNPush("6"))
button6.grid(row=1, column=2)
button7 = Button(frameButtons, text="7", command=buttonNPush("7"))
button7.grid(row=2, column=0)
button8 = Button(frameButtons, text="8", command=buttonNPush("8"))
button8.grid(row=2, column=1)
button9 = Button(frameButtons, text="9", command=buttonNPush("9"))
button9.grid(row=2, column=2)
button0 = Button(frameButtons, text="0", command=buttonNPush("0"))
button0.grid(row=3, column=0)
buttonClear = Button(frameButtons, text="C", command=clearScr)
buttonClear.grid(row=4, column=0)
root.mainloop()

It just prints:

1
12
123
1234
12345
123456
1234567
12345678
123456789
1234567890

How do I make it wait until I press the buttons to add the numbers to the string. The buttons also don't run the event that they are meant to run.

from Tkinter import *

def frame(root, side): 
    w = Frame(root)
    w.pack(side=side, expand=YES, fill=BOTH)
    return w

def button(root, side, text, command=None): 
    w = Button(root, text=text, command=command) 
    w.pack(side=side, expand=YES, fill=BOTH)
    return w

class Calculator(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.option_add('*Font', 'Verdana 12 bold')
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Simple Calculator')
        self.master.iconname("calc1")

        display = StringVar()
        Entry(self, relief=SUNKEN, textvariable=display).pack(side=TOP, expand=YES, fill=BOTH)

        for key in ("123", "456", "789", "-0."):
            keyF = frame(self, TOP)
            for char in key:
                button(keyF, LEFT, char,
                       lambda w=display, c=char: w.set(w.get() + c))

        opsF = frame(self, TOP)
        for char in "+-*/=":
            if char == '=':
                btn = button(opsF, LEFT, char)
                btn.bind('<ButtonRelease-1>',
                         lambda e, s=self, w=display: s.calc(w), '+')
            else:
                btn = button(opsF, LEFT, char,
                   lambda w=display, s=' %s '%char: w.set(w.get()+s))

        clearF = frame(self, BOTTOM)
        button(clearF, LEFT, 'Clr', lambda w=display: w.set(''))

    def calc(self, display):
        try:
            display.set(eval(display.get()))
        except:
            display.set("ERROR")

if __name__ == '__main__':
    Calculator().mainloop()

Edited by Nick Evan: Added code-tags

0

Please don't bump up an old thread that has already been solved. It is confusing for the rest of us. Start your own thread if you need help!

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.