1
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

4

1 回答 1

0

这里的问题是有几个正在运行的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()
于 2018-08-08T11:30:59.380 回答