Tkinter 从字典问题创建 RadioButtons

问题描述

这是我的问题:我制作了一个 tkinter 程序,用于计算我妻子制作的作品的成本。她缝制配饰。到目前为止,我的程序运行良好。如果这种面料已经存在于某种目录中,我会在 JSON 文件中进行搜索

当我的目录具有相同的面料名称时,我想制作一个带有单选按钮的弹出窗口。通过检查正确的单选按钮,我选择了正确的面料。所以我提取了相同结构名称的字典,当我输入结构名称条目然后单击 Enter 时,它将字典发送到弹出窗口,该窗口在 for 循环中创建单选按钮。

问题来了,我的单选按钮制作正确,但无法到达状态,也无法选中哪个按钮...

首先,这是字典:

{"Tissu 1": {"Type": "Tissu","Matière": "coton","Prix du coupon": "8","Laise du coupon (cm)": "150","Prix au mètre (€)": 8.0,"Fournisseur": "lol"},"Tissu 2": {"Type": "Tissu","Matière": "molleton","Prix du coupon": "10","Prix au mètre (€)": 10.0,"Tissu 3": {"Type": "Tissu","Prix du coupon": "12","Prix au mètre (€)": 12.0,"Fournisseur": "mol"}}

这是我的代码

首先是主类:

    class ProgramCalcul(tk.Tk):

        def __init__(self,*args,**kwargs):

        self.frames = {}

            for F in (StartPage,CalculTissuPage,CalculMercPage):

                frame = F(container,self)

                self.frames[F] = frame

                frame.grid(row = 0,column = 0,sticky = "nsew")

            self.show_frameSP(StartPage)

        def show_frameSP(self,cont):
            frame = self.frames[cont]

            frame.tkraise()

然后我有一个相互计算页面的类

这是结构计算页面(为了清晰起见,我删除了一些条目和其他小部件,因为它们工作正常):

class CalculTissuPage(tk.Frame):
    def __init__(self,parent,controller):

        tk.Frame.__init__(self,parent)

        tissuType = tk.StringVar()
        TissuNameEntry = tk.Entry(self,textvariable = tissuType,width = 50)
        TissuNameEntry.grid(row = 2,padx = 20,pady = 5,sticky = "ew")

        def keyPress(arg):
            checkCatalogueTissu(TissuNameEntry.get())
        TissuNameEntry.bind('<Return>',keyPress)

        def checkCatalogueTissu(txt):

            tmpDict = {}

            with open("catalogue tissu.json") as json_file:
                data = json.load(json_file)

                dictLen = len(data)
                for i in range(1,dictLen+1):

                    if "Tissu {}".format(i) not in data:
                        pass

                    else:
                        if data["Tissu {}".format(i)]["Matière"] == txt:

                            tmpDict["Tissu {}".format(i)] = data["Tissu {}".format(i)]

            popupRadio(tmpDict)

        def setText(txtPrix,txtFournisseur,txtLaise,txtLong):
            couponPrixEntry.delete(0,tk.END)
            couponPrixEntry.insert(0,txtPrix)
            fournisseurEntry.delete(0,tk.END)
            fournisseurEntry.insert(0,txtFournisseur)
            laiseDimEntry.delete(0,tk.END)
            laiseDimEntry.insert(0,txtLaise)
            longCouponEntry.delete(0,tk.END)
            longCouponEntry.insert(0,txtLong)

最后是创建显示单选按钮的弹出窗口的函数

def popupRadio(tmpDict):

    popup = tk.Toplevel()
    popup.wm_title("!")

    popupVar = tk.Intvar()

    def checkState(popupVar):
        print(popupVar.get())


    for (key,val) in tmpDict.items():

        tk.Radiobutton(popup,text = key,variable = popupVar,value = val,command = checkState(popupVar)).grid()
        print(key,popupVar.get())

    chk = ttk.Button(popup,text = "Select this",command = checkState(popupVar))
    chk.grid()

    popup.mainloop()

当我运行它时,checkState() 方法似乎自动运行,然后 chk 按钮不执行任何操作...我可以检查单选按钮但没有任何反应(即使我在单选按钮中传递 command=chechState设置。我想在我的 setText() 方法中进一步检查哪个按钮使用此值。

目前,这是 print() 在我的控制台中发送的输出

0
Tissu 1 0
0
Tissu 3 0
0

所以我来了,我已经 2 天没有尝试过我在网上找到的所有东西了,但什么都没有......

非常感谢您的帮助

PS:对不起,如果我的英语不完美:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)