Python can';t获取ttk.checkbutton组的变量值

Python can';t获取ttk.checkbutton组的变量值,python,checkbox,tkinter,Python,Checkbox,Tkinter,我正在使用类clsGrpCheckButton创建3组ttk.checkbutton。 问题是我只能访问上一个创建的组的状态,而不能访问上一个组的状态 单击任何组的某个复选按钮时,我希望得到该组中选中的复选按钮列表(使用方法chkGrpGetValue with是每个checkbutton的命令参数) 但是,无论单击哪个按钮,该方法都只返回最后一个组的状态 这是重新创建问题的代码,附件中有一张显示问题的图片 谢谢你的帮助。 Rgds 将tkinter作为tk导入 从tkinter导入ttk 作为

我正在使用类clsGrpCheckButton创建3组ttk.checkbutton。 问题是我只能访问上一个创建的组的状态,而不能访问上一个组的状态

单击任何组的某个复选按钮时,我希望得到该组中选中的复选按钮列表(使用方法chkGrpGetValue with是每个checkbutton的命令参数)

但是,无论单击哪个按钮,该方法都只返回最后一个组的状态

这是重新创建问题的代码,附件中有一张显示问题的图片

谢谢你的帮助。 Rgds

将tkinter作为tk导入
从tkinter导入ttk
作为pd进口熊猫
类clsGrpCheckButton(ttk.Checkbutton):
定义初始化(self、pContainer、pLstVal、pCommand、pInitValue=True):
self.grpChk=[0]*len(pLstVal)
self.grpKey=[0]*len(pLstVal)
self.grpLstVal=[0]*len(pLstVal)
self.grpVariable=[0]*len(pLstVal)
self.grpActiveKeys=[0]
对于枚举中的l,t(pLstVal):
#l:元组列表的索引
self.grpKey[l]=t[0]
self.grpLstVal[l]=t[1]
self.grpVariable[l]=tk.StringVar()
self.grpChk[l]=ttk.Checkbutton(pContainer,text=self.grpLstVal[l],
state='active',
onvalue=self.grpKey[l],
offvalue=“”,
variable=self.grpVariable[l],
命令=pCommand)
#获取默认值
如果是pInitValue:
self.grpVariable[l].set(self.grpKey[l])
self.grpActiveKeys.append(self.grpKey[l])
#在复选框列表中获取索引
#取决于钥匙
def chkGrpGetIdx(自身,pKey):
i=0

最后,当我将命令分配给每个checkbutton时,我通过使用partial找到了一个解决方案。 如果有人面临类似问题,下面是完整的代码

import tkinter as tk
from tkinter import ttk
import pandas as pd
from functools import partial

class clsGrpCheckButton():
    def __init__(self,pContainer, pLstVal,pCommand,pInitValue=True): 

        self.grpChk=[0]*len(pLstVal)   
        self.grpKey=[0]*len(pLstVal)
        self.grpLstVal = [0]*len(pLstVal)
        self.grpVariable= [0]*len(pLstVal)
        self.grpActiveKeys = [0]

        for l,t in enumerate(pLstVal):
            #l : index of the list of tuples
            self.grpKey[l] = t[0]
            self.grpLstVal[l] = t[1]
            self.grpVariable[l] = tk.StringVar()
            self.grpChk[l] = ttk.Checkbutton(pContainer, text=self.grpLstVal[l],
                                   state='active' ,
                                   onvalue= self.grpKey[l], 
                                   offvalue= '', 
                                   variable =  self.grpVariable[l], 
                                   command=partial(pCommand,self))

            #get default value
            if pInitValue :
                self.grpVariable[l].set(self.grpKey[l])
                self.grpActiveKeys.append(self.grpKey[l]) 

    #get the index in the list of checkboxes
    # depending on the key
    def chkGrpGetIdx(self, pKey):
        i=0
        while i <len(self.grpKey):
            if self.grpKey[i]==pKey :
                return i
                i=len(self.grpKey)
            else:
                i+=1

    def chkGrpSetValue(self, pKey, pValue):
        #need find correct index first
        i=self.chkGrpGetIdx(pKey)
        self.grpVariable[i] = pValue

    #return the list of keys of the group
    def chkGrpKeyLst(self):
        return self.grpKey

    #return the checkox element of the group of checkox
    def chkGrpGetChkObj(self,pKey):
        i=self.chkGrpGetIdx(pKey)
        return self.grpChk[i]

    #action when check/uncheck
    #at list one element should be active
    def chkGrpGetValue(self):
        i=0
        r=len(self.grpVariable)
        self.grpActiveKeys.clear()
        while i < len(self.grpVariable):

            if self.grpVariable[i].get() =='':
                r-=1
            else:
                self.grpActiveKeys.append(self.grpKey[i])
            i+=1         
        if r==0:
            self.grpVariable[0].set(self.grpKey[0])
            self.grpActiveKeys.append(self.grpKey[0])
        print(self.grpActiveKeys)
    #to avoid accessing to class attribute directly
    def chkGetCheckedValues(self):
        return self.grpActiveKeys


class clsWindows(tk.Tk):
    def __init__(self): 
        tk.Tk.__init__(self)

        la = [1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3]
        lb= [10,11,12,14,15,20,21,22,23,24,25,26,30,31,32,33]
        lc=['d10','d11','d12','d14','d15','d20','d21','d22','d23','d24','d25','d26','d30','d31','d32','d33']

        df = pd.DataFrame(
            {'DIVISION': la,
             'DEPT_CODE': lb,
             'DEPT_NAME': lc
             })      

        lW = list(zip(df['DIVISION'].astype(str) , df['DEPT_CODE'].astype(str)))
        lpt = list(zip(df['DEPT_CODE'].astype(str) , df['DEPT_NAME'].astype(str)))
        curHead = ""
        r=0
        c=-1
        for head, DPT in lW: 
            if not curHead==head:
                curHead = head
                c+=1
                r=0      
                dq=df.query('DIVISION=='+head)
                lpt = list(zip(dq['DEPT_CODE'].astype(str) , dq['DEPT_NAME'].astype(str)))  
                t=ttk.Labelframe(self,text=head)
                t.grid(column=c, row=0, sticky='nw') 
                checkGrpDept= clsGrpCheckButton(t,lpt,clsGrpCheckButton.chkGrpGetValue,True)                    
            checkGrpDept.chkGrpGetChkObj(DPT).grid(column=c, row=r, sticky='nw')
            t.rowconfigure(r, weight=1)
            t.columnconfigure(c, weight=1)
            r+=1

    def wQuit(self):
        self.destroy()           

app = clsWindows()
app.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
作为pd进口熊猫
从functools导入部分
类clsGrpCheckButton():
定义初始化(self、pContainer、pLstVal、pCommand、pInitValue=True):
self.grpChk=[0]*len(pLstVal)
self.grpKey=[0]*len(pLstVal)
self.grpLstVal=[0]*len(pLstVal)
self.grpVariable=[0]*len(pLstVal)
self.grpActiveKeys=[0]
对于枚举中的l,t(pLstVal):
#l:元组列表的索引
self.grpKey[l]=t[0]
self.grpLstVal[l]=t[1]
self.grpVariable[l]=tk.StringVar()
self.grpChk[l]=ttk.Checkbutton(pContainer,text=self.grpLstVal[l],
state='active',
onvalue=self.grpKey[l],
offvalue=“”,
variable=self.grpVariable[l],
命令=部分(pCommand,self))
#获取默认值
如果是pInitValue:
self.grpVariable[l].set(self.grpKey[l])
self.grpActiveKeys.append(self.grpKey[l])
#在复选框列表中获取索引
#取决于钥匙
def chkGrpGetIdx(自身,pKey):
i=0

虽然我可以你缩进你的代码正确吗?亲爱的,做了对不起。请提供一个。如果没有它,你很难理解你的问题,而且除了你之外,它不可能对任何人都有帮助。由于类的原因,代码仍然是“长的”,因为我的假设是类中存在一些错误
import tkinter as tk
from tkinter import ttk
import pandas as pd
from functools import partial

class clsGrpCheckButton():
    def __init__(self,pContainer, pLstVal,pCommand,pInitValue=True): 

        self.grpChk=[0]*len(pLstVal)   
        self.grpKey=[0]*len(pLstVal)
        self.grpLstVal = [0]*len(pLstVal)
        self.grpVariable= [0]*len(pLstVal)
        self.grpActiveKeys = [0]

        for l,t in enumerate(pLstVal):
            #l : index of the list of tuples
            self.grpKey[l] = t[0]
            self.grpLstVal[l] = t[1]
            self.grpVariable[l] = tk.StringVar()
            self.grpChk[l] = ttk.Checkbutton(pContainer, text=self.grpLstVal[l],
                                   state='active' ,
                                   onvalue= self.grpKey[l], 
                                   offvalue= '', 
                                   variable =  self.grpVariable[l], 
                                   command=partial(pCommand,self))

            #get default value
            if pInitValue :
                self.grpVariable[l].set(self.grpKey[l])
                self.grpActiveKeys.append(self.grpKey[l]) 

    #get the index in the list of checkboxes
    # depending on the key
    def chkGrpGetIdx(self, pKey):
        i=0
        while i <len(self.grpKey):
            if self.grpKey[i]==pKey :
                return i
                i=len(self.grpKey)
            else:
                i+=1

    def chkGrpSetValue(self, pKey, pValue):
        #need find correct index first
        i=self.chkGrpGetIdx(pKey)
        self.grpVariable[i] = pValue

    #return the list of keys of the group
    def chkGrpKeyLst(self):
        return self.grpKey

    #return the checkox element of the group of checkox
    def chkGrpGetChkObj(self,pKey):
        i=self.chkGrpGetIdx(pKey)
        return self.grpChk[i]

    #action when check/uncheck
    #at list one element should be active
    def chkGrpGetValue(self):
        i=0
        r=len(self.grpVariable)
        self.grpActiveKeys.clear()
        while i < len(self.grpVariable):

            if self.grpVariable[i].get() =='':
                r-=1
            else:
                self.grpActiveKeys.append(self.grpKey[i])
            i+=1         
        if r==0:
            self.grpVariable[0].set(self.grpKey[0])
            self.grpActiveKeys.append(self.grpKey[0])
        print(self.grpActiveKeys)
    #to avoid accessing to class attribute directly
    def chkGetCheckedValues(self):
        return self.grpActiveKeys


class clsWindows(tk.Tk):
    def __init__(self): 
        tk.Tk.__init__(self)

        la = [1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3]
        lb= [10,11,12,14,15,20,21,22,23,24,25,26,30,31,32,33]
        lc=['d10','d11','d12','d14','d15','d20','d21','d22','d23','d24','d25','d26','d30','d31','d32','d33']

        df = pd.DataFrame(
            {'DIVISION': la,
             'DEPT_CODE': lb,
             'DEPT_NAME': lc
             })      

        lW = list(zip(df['DIVISION'].astype(str) , df['DEPT_CODE'].astype(str)))
        lpt = list(zip(df['DEPT_CODE'].astype(str) , df['DEPT_NAME'].astype(str)))
        curHead = ""
        r=0
        c=-1
        for head, DPT in lW: 
            if not curHead==head:
                curHead = head
                c+=1
                r=0      
                dq=df.query('DIVISION=='+head)
                lpt = list(zip(dq['DEPT_CODE'].astype(str) , dq['DEPT_NAME'].astype(str)))  
                t=ttk.Labelframe(self,text=head)
                t.grid(column=c, row=0, sticky='nw') 
                checkGrpDept= clsGrpCheckButton(t,lpt,clsGrpCheckButton.chkGrpGetValue,True)                    
            checkGrpDept.chkGrpGetChkObj(DPT).grid(column=c, row=r, sticky='nw')
            t.rowconfigure(r, weight=1)
            t.columnconfigure(c, weight=1)
            r+=1

    def wQuit(self):
        self.destroy()           

app = clsWindows()
app.mainloop()