0

This is my first GUI attempt with python using tkinter and I cannot figure out what is the problem:

here is my initial code:

from tkinter import *

root_app = Tk()
root_app.title("Test App")

#Question 1 - best car brand
v1 = StringVar()
v1.set(None)
Label(root_app, text="What is your favorite car barnd?\n", font=('Helvatical bold',16), fg='#ff0').pack()

r1 = Radiobutton(root_app, text='Mazda', value='Mazda', variable=v1).pack()
r2 = Radiobutton(root_app, text='BMW', value='BMW', variable=v1).pack()
r3 = Radiobutton(root_app, text='Ford', value='Ford', variable=v1).pack()

#Question 2 - best sports brand
v1 = StringVar()
v1.set(None)
Label(root_app, text="What is your favorite sports barnd?\n", font=('Helvatical bold',16), fg='#ff0').pack()

r1 = Radiobutton(root_app, text='Nike', value='Nike', variable=v1).pack()
r2 = Radiobutton(root_app, text='Adidas', value='Adidas', variable=v1).pack()
r3 = Radiobutton(root_app, text='Puma', value='Puma', variable=v1).pack()

root_app.mainloop()

It works but the radio buttons are shown vertically:

enter image description here

I tried to use side='left' configuration for pack() in my code:

r1 = Radiobutton(root_app, text='Mazda', value='Mazda', variable=v1).pack(side='left')
r2 = Radiobutton(root_app, text='BMW', value='BMW', variable=v1).pack(side='left')
r3 = Radiobutton(root_app, text='Ford', value='Ford', variable=v1).pack(side='left')

but I got a messy frame and cannot figure out how to fix it horizontally under each label:

enter image description here

MTALY
  • 1,430
  • 2
  • 18
  • 26
  • 1
    You should take a look at [this](https://stackoverflow.com/a/63536506/13629335) to start with. As a hint, it is important to imagine the final GUI or at least you should have an idea of it. For example, you could stick to `.pack()` geometry and use frames where you pack them *left*, or you could switch to `.grid()` geometry management and work something out (e.g. columnspan). – Thingamabobs Aug 27 '22 at 21:11
  • `pack()` is better to keep all in one column or to keep all in one row. You may need to use `Frame` to keep radiobuttons in one row, and to keep this frame with other elements in one column – furas Aug 28 '22 at 11:03
  • you don't need `\n` in label. If you want to create distance then better use `pady=` or `ipady=` in `pack()` – furas Aug 28 '22 at 11:11

1 Answers1

1

pack() is better to keep all in one column or in one row.

You may need to use Frame to keep radiobuttons in one row, and keep this frame with other elements in one column.

import tkinter as tk   # PEP8 `import *` is not preferred

root = tk.Tk()
root.title("Test App")

# Question 1 - best car brand  # PEP8: one space after `#` (and two spaces before `#` if there is code before `#`)
v1 = tk.StringVar(root)
v1.set(None)
tk.Label(root, text="What is your favorite car barnd?").pack(pady=10, padx=10)

frame_1 = tk.Frame(root)
frame_1.pack()

tk.Radiobutton(frame_1, text='Mazda', value='Mazda', variable=v1).pack(side='left')
tk.Radiobutton(frame_1, text='BMW',   value='BMW',   variable=v1).pack(side='left')
tk.Radiobutton(frame_1, text='Ford',  value='Ford',  variable=v1).pack(side='left')

# Question 2 - best sports brand  # PEP8: one space after `#` (and two spaces before `#` if there is code before `#`)
v2 = tk.StringVar(root)  # you have to use other name for variable
v2.set(None)
tk.Label(root, text="What is your favorite sports barnd?").pack(pady=10, padx=10)

frame_2 = tk.Frame(root)
frame_2.pack(pady=(0,10))  # add pad only below

tk.Radiobutton(frame_2, text='Nike',   value='Nike',   variable=v2).pack(side='left')
tk.Radiobutton(frame_2, text='Adidas', value='Adidas', variable=v2).pack(side='left')
tk.Radiobutton(frame_2, text='Puma',   value='Puma',   variable=v2).pack(side='left')

root.mainloop()

enter image description here


PEP 8 -- Style Guide for Python Code


You don't need \n in Label. Better use pady (or ipady1) in pack()

Using r1 = Radiobutton(...).pack() you assign None to r1 because pack()/grid()/place() always gives None. You may skip r1 = if you will no use r1 later. Or you have to do it in two steps r1 = Radiobutton(...) and later r1.pack()


EDIT:

Eventually you could use grid() with columnspan for labels (to use 3 columns) but it looks little different because radiobuttons in the same column share width of cell. Besides when you use more radiobuttons then you have to change columnspan. With Frame you don't have to do this.

import tkinter as tk   # PEP8 `import *` is not preferred

root = tk.Tk()
root.title("Test App")

# Question 1 - best car brand  # PEP8: one space after `#` (and two spaces before `#` if there is code before `#`)
v1 = tk.StringVar(root)
v1.set(None)
tk.Label(root, text="What is your favorite car barnd?").grid(row=0, column=0, columnspan=3, pady=10, padx=10)

tk.Radiobutton(root, text='Mazda', value='Mazda', variable=v1).grid(row=1, column=0)
tk.Radiobutton(root, text='BMW',   value='BMW',   variable=v1).grid(row=1, column=1)
tk.Radiobutton(root, text='Ford',  value='Ford',  variable=v1).grid(row=1, column=2)

# Question 2 - best sports brand  # PEP8: one space after `#` (and two spaces before `#` if there is code before `#`)
v2 = tk.StringVar(root)  # you have to use other name for variable
v2.set(None)
tk.Label(root, text="What is your favorite sports barnd?").grid(row=2, column=0, columnspan=3, pady=10, padx=10)

tk.Radiobutton(root, text='Nike',   value='Nike',   variable=v2).grid(row=3, column=0)
tk.Radiobutton(root, text='Adidas', value='Adidas', variable=v2).grid(row=3, column=1)
tk.Radiobutton(root, text='Puma',   value='Puma',   variable=v2).grid(row=3, column=2)

root.mainloop()

enter image description here

furas
  • 134,197
  • 12
  • 106
  • 148