2016-12-12 67 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