Графический пользовательский интерфейс с позицией и действиями кнопки TK

Я начал использовать TK в python для создания графического интерфейса для моей программы. Я не могу исправить 2 проблемы относительно (1) положения кнопки в окне и (2) использовать значение радиоблока внутри fucntion.

Это мой текущий код:

root = tk.Tk()
root.title("START")
root.geometry("500x200+500+200")

v = tk.IntVar()
v.set(0)  # initializing the choice

my_choise = [
("Basic",1),
("Advanced",2),
('Extreme',3)
]

def ShowChoice():
    print(v.get())

tk.Label(root, 
     text="""Choose your configuration:""",
     justify = tk.LEFT,
     padx = 20).pack()

val = 0
for val, choise in enumerate(my_choise):
    tk.Radiobutton(root,text=choise,padx = 20,variable=v,command=ShowChoice,value=val).pack(anchor=tk.W)


def star_program(value):
    os.system("ifconfig")

def open_comments_file():
    os.system("gedit /home/user/Desktop/comments.txt")

def open_links_file():
    os.system("gedit /home/user/Desktop/links.txt")

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

open_file_c = tk.Button(frame, 
               text="Comments",
               command=open_comments_file)

open_file_f = tk.Button(frame, 
               text="Links",
               command=open_links_file)

button = tk.Button(frame, 
               text="Start",
               command=star_program(v.get()))

button.pack(side=tk.LEFT)
open_file_f.pack(side=tk.LEFT)
open_file_c.pack(side=tk.LEFT)

slogan = tk.Button(frame,
               text="Cancel",
               command=quit)
slogan.pack(side=tk.LEFT)

root.mainloop()

Мне бы хотелось, чтобы кнопки "Ссылки" и "Комментарии" располагались ниже радиоблока, один под другим. Теперь все кнопки находятся в строке, но я хотел бы "начать" и "отменить" в нижней части окна.

Затем я попытался использовать значение радиобъекта (выбор) внутри функции star_program. Это не работает. Моя идея основана на выборе, выбранном в radioobutton, выполнять различные действия, когда я нажимаю кнопку "start":

    def star_program(value):
        if value == 0:
            os.system("ifconfig")
        else:
            print "Goodbye"

Кроме того, что касается кнопки "start", у меня странное поведение. Программа запускает команду ifconfig также, если я не нажимаю "start". И если я нажму "start", он не выполнит никаких действий.

Любое предложение? Спасибо!!!

Ответ 1

Я предполагаю, что это больше похоже на то, что вам нужно:

root = tk.Tk()
root.title("START")
root.geometry("500x200+500+200")

v = tk.IntVar()
v.set(0)  # initializing the choice

my_choise = [
("Basic",1),
("Advanced",2),
('Extreme',3)
]

def ShowChoice():
    print(v.get())

tk.Label(root, 
     text="""Choose your configuration:""",
     justify = tk.LEFT,
     padx = 20).grid(column=1, row=0, sticky="nesw") # use grid instead of pack

root.grid_columnconfigure(1, weight=1)

val = 0
for val, choise in enumerate(my_choise):
    tk.Radiobutton(root,text=choise,padx = 20,variable=v,command=ShowChoice,value=val).grid(column=1, row=val+1, sticky="nw")


def star_program(value):
    os.system("ifconfig")

def open_comments_file():
    os.system("gedit /home/user/Desktop/comments.txt")

def open_links_file():
    os.system("gedit /home/user/Desktop/links.txt")

frame = tk.Frame(root)
frame.grid(column=1, row=4, sticky="nesw")

open_file_c = tk.Button(frame, 
               text="Comments",
               command=open_comments_file)

open_file_f = tk.Button(frame, 
               text="Links",
               command=open_links_file)

button = tk.Button(frame, 
               text="Start",
               command=lambda: star_program(v.get()))
# use lambda to create an anonymous function to be called when button pushed,
needed for functions where arguments are required

button.grid(column=2, row=3, sticky="nesw")
open_file_f.grid(column=1, row=1, sticky="nesw")
open_file_c.grid(column=1, row=2, sticky="nesw")

slogan = tk.Button(frame,
               text="Cancel",
               command=quit)
slogan.grid(column=4, row=3, sticky="nesw")

root.mainloop()

Ответ 2

Проблема с кнопкой "Пуск" связана с определением функции. Это правильный код, который не вызывает никаких действий, если вы не нажмете кнопку:

 button = tk.Button(frame, 
           text="Start",
           command=star_program)