Python Single Choice Questions

def ask_choice_question(prompt, options):
    func = tkinter.Tk()
    v = tkinter.IntVar()
    v.set(-1)
    if(prompt):
        tkinter.Label(func, text=prompt).pack()
    for i, option in enumerate(options):
        tkinter.Radiobutton(func, text=option, variable=v, value=i).pack(anchor="w")
    tkinter.Button(func, text="Submit", command=func.destroy).pack()
    func.mainloop()
    print(v.get())
    if(v.get()== -1):
        return None
    print(options[v.get()])
    return options[v.get()]

Просматривая этот сайт, я нашел что-то похожее на приведенный выше пример и немного его изменил.

Тем не менее, при вызове func.destroy кажется, что func ничего не возвращает, также как и "print()"- ничего не делают. Что?

РЕДАКТИРОВАТЬ: На самом деле, я мог бы добавить, что этот вопрос задается внутри другого окна Tkinter, и он фактически выводит то, что нужно, когда это окно закрыто.

РЕДАКТИРОВАТЬ 2: Также может быть полезно сказать, что меню, которое я получаю, выглядит примерно так: http://prntscr.com/kg516z

1 ответ

Решение

Проблема здесь в том, что есть несколько запущенных Tk экземпляры (т.е. несколько интерпретаторов tcl) и IntVar в функции не принадлежит func но к Tk экземпляр создан первым. Как следствие, его значение не изменяется радиокнопками.

Я советую вам использовать только один Tk экземпляр, заменяющий func = tkinter.Tk() от func = tkinter.Toplevel() и используя wait_window(func) (Подожди пока func уничтожен) вместо mainloop():

import tkinter

def ask_choice_question(prompt, options):
    func = tkinter.Toplevel(root)
    v = tkinter.IntVar(root, -1)
    if(prompt):
        tkinter.Label(func, text=prompt).pack()
    for i, option in enumerate(options):
        tkinter.Radiobutton(func, text=option, variable=v, value=i).pack(anchor="w")
    tkinter.Button(func, text="Submit", command=func.destroy).pack()
    func.wait_window(func)
    print(v.get())
    if(v.get()== -1):
        return None
    print(options[v.get()])
    return options[v.get()]


root = tkinter.Tk()
tkinter.Button(root, text='Question',
               command=lambda: print('returns ', ask_choice_question('Question?', ['Answer %i' % i for i in range(1, 5)]))).pack()
root.mainloop()

Если вы действительно хотите сохранить несколько Tk экземпляры, то вам нужно указать мастер вашего IntVar а также заменить mainloop() от wait_window(func) (хотя я не знаю почему):

import tkinter

def ask_choice_question(prompt, options):
    func = tkinter.Tk()
    v = tkinter.IntVar(func, -1)
    if(prompt):
        tkinter.Label(func, text=prompt).pack()
    for i, option in enumerate(options):
        tkinter.Radiobutton(func, text=option, variable=v, value=i).pack(anchor="w")
    tkinter.Button(func, text="Submit", command=func.destroy).pack()
    func.wait_window(func)
    print(v.get())
    if(v.get()== -1):
        return None
    print(options[v.get()])
    return options[v.get()]

root = tkinter.Tk()
tkinter.Button(root, text='Question',
               command=lambda: print('returns ', ask_choice_question('Question?', ['Answer %i' % i for i in range(1, 5)]))).pack()
root.mainloop()
Другие вопросы по тегам