Python 单选题
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 没有 return 任何东西,"print()"-s 也没有做任何事情。做什么?
编辑:实际上,我可能会补充一点,这个问题是在另一个 Tkinter window 中提出的,它实际上输出了 window 关闭时需要的内容。
EDIT2:我得到的菜单看起来像这样也可能有用:http://prntscr.com/kg516z
这里的问题是有几个运行 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()
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 没有 return 任何东西,"print()"-s 也没有做任何事情。做什么?
编辑:实际上,我可能会补充一点,这个问题是在另一个 Tkinter window 中提出的,它实际上输出了 window 关闭时需要的内容。
EDIT2:我得到的菜单看起来像这样也可能有用:http://prntscr.com/kg516z
这里的问题是有几个运行 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()