Python单选题

时间:2018-08-08 07:24:30

标签: python tkinter tkinter-menu

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()” -s也不会执行任何操作。怎么办?

编辑:实际上,我可能要补充一点,这个问题是在另一个Tkinter窗口中提出的,并且实际上在关闭该窗口时会输出所需的内容。

EDIT2:我得到的菜单看起来像这样:http://prntscr.com/kg516z

1 个答案:

答案 0 :(得分:0)

这里的问题是有几个正在运行的Tk实例(即几个tcl解释器),并且函数中的IntVar不属于func,而是属于{{1} }实例首先创建。因此,单选按钮不会修改其值。

我建议您仅使用一个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)