0

So I'm following a tutorial on tkinter in Python, we're making a basic calculator but I can't seem to get my equals button to fit in with the other buttons, it's either too long or too short or ends up changing the size of the button directly above it. From my understanding, the grid system works because button positions are relative to each other which I understand. Is there a way to fix this?

from tkinter import *

root = Tk()
root.title("Simple Calculator")

e = Entry(root, width=35, bg='white', fg='red', borderwidth=5)
# padx, pady add "padding" or space around the entry widget.
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
# Button functions

def button_add():
    return

# Define the buttons
button_1 = Button(root, text='1', padx= 40, pady=20, command=button_add)
button_2 = Button(root, text='2', padx= 40, pady=20, command=button_add)
button_3 = Button(root, text='3', padx= 40, pady=20, command=button_add)
button_4 = Button(root, text='4', padx= 40, pady=20, command=button_add)
button_5 = Button(root, text='5', padx= 40, pady=20, command=button_add)
button_6 = Button(root, text='6', padx= 40, pady=20, command=button_add)
button_7 = Button(root, text='7', padx= 40, pady=20, command=button_add)
button_8 = Button(root, text='8', padx= 40, pady=20, command=button_add)
button_9 = Button(root, text='9', padx= 40, pady=20, command=button_add)
button_0 = Button(root, text='0', padx= 40, pady=20, command=button_add)
button_add = Button(root, text='+', padx= 39, pady= 20, command=button_add)
button_clear = Button(root, text='Clear', padx= 77, pady= 20, command=button_add)
button_equal = Button(root, text='=', padx= 87, pady= 20, command=button_add)

# Display the buttons on the screen.
button_1.grid(row=3, column=0)
button_2.grid(row=3, column=1)
button_3.grid(row=3, column=2)

button_4.grid(row=2, column=0)
button_5.grid(row=2, column=1)
button_6.grid(row=2, column=2)

button_7.grid(row=1, column=0)
button_8.grid(row=1, column=1)
button_9.grid(row=1, column=2)

button_0.grid(row=4, column=0)
button_clear.grid(row=4, column=1, columnspan=2)
button_add.grid(row=5, column=0)
button_equal.grid(row=5, column=1, columnspan=2)



root.mainloop()
  • Not related to your problem but instead of `button_1 = Button(..., command=button_add)` you can use `button_1 = Button(..., command=lambda: button_add(1))`. That will pass `1` to `button_add` so it knows which button was pressed. – TheLizzard Apr 26 '21 at 20:57
  • try adding `sticky='nsew'` to all the grid calls as a keyword argument (just like `column=1` or similar) – Matiiss Apr 26 '21 at 21:02
  • also it could be that this issue gets solved later in the tutorial – Matiiss Apr 26 '21 at 21:05
  • If the tutorial blindly asked you to follow this, then you should question its credibility. AFAIK, `padx` and `pady` takes in pixels. And pixels are screen relative. These pixels shown in the tutorial works for the resolution of the tutor, but not for your resolution. Adjusting `padx` and `pady` should fix it. – Delrius Euphoria Apr 26 '21 at 21:50
  • @Matiiss Your first suggestion is terrible and can cause so much trouble down the line. Look at [this](https://stackoverflow.com/q/1101750/11106801). There are so many people that use your approach not fully understanding that you loose the handle to the variable and trying to call functions on it. I would even consider it bad practise to do that. Also your suggestion will make the code run faster but the difference will be unnoticeable even if you ran the code 1000 times. – TheLizzard Apr 26 '21 at 22:04
  • @TheLizzard my suggestion was using plain `Button().grid()` without any variables and I do understand that `.grid` or any other layout manager returns None so they are pointless to assign to a variable that is why I don't use one at all. For example for Buttons if I don't plan on changing anything about their placement or destroying them individually I won't use a variable I will just do `Button(master, kwargs).pack()` that shouldn't cause any issues, should it? only drawback would be that using variables helps with organization a bit but might as well use comments for that – Matiiss Apr 26 '21 at 22:22
  • @Matiiss The problem is that you might know that `.grid()` returns `None` but other people (and there are a lot of them) don't get why the widget isn't stored in the variable. That is why I consider it bad practise. Even if OP already knows this, someone in the future might try to copy your suggestion and it might cause more harm then good. I see people make that mistake almost daily. – TheLizzard Apr 26 '21 at 23:03

0 Answers0