2016-12-12 68 views
0

我有一个基于查询生成的检查按钮列表 - 它根据搜索条件填充,并且能够通过第二次搜索和/或清除列表来销毁。我还将checkbutton值存储在一个列表中(todoList)。我在哪里挣扎是如何检查checkbuttons是否被选中或不在“提交”功能。下面是包含todoList操作时生成的checkbutton的方式。我肯定在我的逻辑中错过了一些可以动态获取值的东西,但我没有看到它,需要一点帮助。检查动态列表中检查按钮的状态

while data: 
    specno = data[0] 
    fname = data[1] 
    lname = data[2] 
    self.todoList.append(specno) 
    #self.var1 = IntVar() 
    n = len(self.buttonList) 
    lx = Checkbutton(self.listFrame, 
        text=self.todoList[n], 
        variable=self.todoList[n], 
        onvalue = 1, 
        offvalue = 0) 
    ni = n 
    self.buttonListNum.append(ni) 
    lx.grid(row=n, column=0, sticky='NW') 
    self.buttonList.append(lx) 
    data = cursor.fetchone() 
+0

'变量=''预计STRINGVAR()','IntVar()'等WHN你检查checkbutton然后它在'STRINGVAR改变值() '/'IntVar()'。所以你可以检查这个'StringVar()'/'IntVar()'。 – furas

+0

我想这就是我失败的地方 - 如果我要将语句更改为variable = IntVar() - 稍后我如何检查所有checkbutton的值? –

回答

1

所以我想通了,如何处理这一点 - 因为状态检查要求checkbutton的变量属性是一个IntVar(),StrVar()等等,我所做的是一个变量设置为IntVar( ),然后将这些附加到与buttonList []和todoList []列表具有相同索引的单独列表中,以便稍后使用下面显示的checkStatus函数检查状态。

def add(self): 
    self.removeCheckButton() 
    entry = self.entryBox.get() 
    self.entryBox.delete(0, END) 
    search = ("%QUERY%") 
    cursor.execute(search) 
    data = cursor.fetchone() 
    while data: 
    specno = data[0] 
    fname = data[1] 
    lname = data[2] 
    self.todoList.append(specno) 
    var = IntVar() 
    n = len(self.buttonList) 
    lx = Checkbutton(self.listFrame, 
        text=self.todoList[n], 
        variable= selvar, 
        onvalue = 1, 
        offvalue = 0) 
    ni = n 
    self.buttonListNum.append(ni) 
    self.varList.append(var) 
    lx.grid(row=n, column=0, sticky='NW') 
    self.buttonList.append(lx) 
    data = cursor.fetchone() 


def checkStatus(self): 
    for i in self.buttonListNum: 
    print(self.varList[i].get()) 
+0

'buttonListNum'没用 - 你可以在self.varList中执行'x:print(x.get())'并且如果你需要它的索引然后使用'enumerate' - 'for i,x在枚举中(self.varList ):print(i,x.get())' – furas

0

你的代码,但清洁

  • 可以使用for代替while然后你不需要data = cursor.fetchone()
  • 你不需要self.buttonListNum
  • 你不必在名称中添加Listbuttonsvars更具可读性。如果你想在名称List那么首选是button_listvar_list

for n, data in enumerate(cursor): 
    specno = data[0] 
    var = IntVar() 

    lx = Checkbutton(self.listFrame, 
        text=specno, 
        variable=var, 
        onvalue=1, 
        offvalue=0) 
    lx.grid(row=n, column=0, sticky='NW') 

    self.todoList.append(specno) 
    self.buttons.append(lx) 
    self.vars.append(var) 

并检查VARS:

def check_status(self): 
    for i, var in enumerate(self.vars): 
     print(i, var.get()) 
+0

我实际上需要buttonListNum来实现我还没有显示的其他函数,但它与这里的问题无关,所以你是对的 - 我应该删除从我的示例代码。感谢您的帮助! –

+0

至于我'buttonListNum'没用 - 它的值是[[0,1,2,3,...,n-1]'。你可以用'list(range(n))'得到相同的值,其中'n = len(buttonList)'或'n = len(vars)'。但大多数情况下,我们使用'enumerate(some_list)'来获取这个值。 – furas