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()