root.mainloop()之后如何从选定的单选按钮检索值?

时间:2019-03-22 19:59:13

标签: python-3.x tkinter

我正在寻找一个弹出窗口,要求用户选择一个特定的选项,如果该选项不存在,则将其添加。但是,我在检索所选选项的值(即dict中的键)时遇到麻烦。到目前为止,我的代码已总结:

import tkinter as tk

class Category():

    def __init__(self):
        self.categories = {1:"Coffee",2: "Tesco"}

    def index(...):

        # code ... #

        root = tk.Tk()
        v = tk.IntVar()

        # I was thinking this would help:
        def quit():
            global irow
            irow = v.get()
            print("Irow is",irow)
            root.quit()

        tk.Label(root, text="Choose category:").pack()
        for key, cat in self.categories.items():
            tk.Radiobutton(root, text=cat, variable=v, value=key).pack()
        tk.Radiobutton(root, text="Other", variable=v, value=key+1).pack()
        # I want to add a text box here so user can add the "Other"

        tk.Button(root, text="Close", command=quit)
        irow = v.get()
        print(irow)
        root.mainloop()
        print(irow)
        # code which uses irow #

执行此代码将产生:

0
Irow is 0
0

无论我选择什么按钮。我希望irow是2,如果我选择咖啡则选择Tesco或1(如果选择其他咖啡则选择3)。任何指导将不胜感激。

2 个答案:

答案 0 :(得分:1)

通常,mainloop仅在销毁所有小部件之后退出。因此,此时您无法直接从小部件中获取值。最简单的解决方案是将值保存到全局变量,如果使用的是类,则将其保存到实例变量。

例如,您可以这样做:

def quit():
    self.irow = v.get()
    root.quit()

然后,在mainloop存在之后,您可以访问self.irow

...
root.mainloop()
print(self.irow)

答案 1 :(得分:0)

谢谢布莱恩·奥克利(Bryan Oakley)的回答。我做了4处更改,使其可以在Linux终端上运行:1)我将类从Tk()更改为Toplevel(); 2)为了简洁起见,我将该对话框放在一个类中; 3)我将self.quit()更改为self.destroy(); &4)我将mainloop()更改为wait_window()。

var formdata = new FormData();
    formdata.append('parameter', 'value');
var postdata = xhr('mypage.php', 'post', function() {
    if (this.status === 200 && this.readyState === 4) {
        return this.response;
    }
    return false;
}, formdata);

console.log(postdata); // === null / undefined

请注意,parent是我从中执行“ AddCategory”对话框的类。我按如下方式调用它:

class AddCategory(tk.Toplevel):

    def __init__(self, parent):
        tk.Toplevel.__init__(self)
        self.v = tk.IntVar()
        self.parent = parent

        tk.Label(self, text="Choose category:").pack()

        for key, cat in self.parent.categories.items():
            tk.Radiobutton(self, text=cat, variable=self.v, value=key).pack()
        tk.Radiobutton(self, text="Other", variable=self.v, value=key+1).pack()

        self.e = tk.Entry(self,text="")
        self.e.pack()
        tk.Button(self, text="Close", command=self.quit).pack()

    def quit(self):
        self.parent.key = self.v.get()
        self.parent.cat = self.e.get()
        print(self.v.get())
        print(self.e.get())
        self.destroy()

之所以可行,是因为AddCategory中的self.parent是父级的软拷贝。