2014-12-11 58 views
0

我建立了一個簡單的待辦事項列表,我試圖讓該複選框清除自身時則檢查checkbutton(以表示任務已經完成)如何刪除當檢查

我不知道我需要如何執行該功能才能自行移除。任何人都可以幫助我解決這個問題。我梳理了一系列的頁面,沒有一個真的表明你是如何做到這一點的。

class App(object): 

def __init__(self, master): 
    self.master = master 
    self.frame = Frame(master) 
    self.frame.grid() 
    self.addFrame = Frame(master) 
    self.addFrame.grid(row=0, column=0, columnspan=2, sticky='N') 
    self.listFrame = Frame(master) 
    self.listFrame.grid(row=1, column=0, columnspan=2, sticky='NW') 
    self.todoList = [] 
    self.initUI() 

def initUI(self): 

    self.entryBox = Entry(self.frame, width = 15) 
    self.entryBox.grid(row=0, column=0, sticky='N') 

    self.addButton = Button(self.frame, text="<-ADD->", command=self.add) 
    self.addButton.grid(row=0, column=1, sticky='N') 


def removeCheckButton(self): 
    # - CONFUSED HOW TO REMOVE THE SPECIFIC CHECKBUTTON 
    pass 

def add(self): 
    entry = self.entryBox.get() 
    self.entryBox.delete(0, END) 
    self.todoList.append(entry) 
    print self.todoList 
    var1 = IntVar() 
    self.buttonList = [] 
    for n in range(len(self.todoList)): 
     lx = Checkbutton(self.listFrame, text=self.todoList[n], variable=self.todoList[n], command=removeCheckButton) 
     lx.grid(row=n, column=0, sticky='NW') 
     self.buttonList.append(lx) 
     print self.buttonList 
+0

作爲第一條評論:'command = removeCheckButton'應該是'command = self.removeCheckButton'。 – Marcin 2014-12-11 03:00:26

+0

在大多數窗口小部件AFAIK上,您可以使用destroy()或grid_forget()。要做到這一點,你將不得不使用partial來將數字傳遞給函數,然後銷燬/忘記self.buttonList [數字]。嘗試一下,看看你是如何做到的。從functools中導入部分內容,並使用command = partial(self.removeCheckButton,number)調用該函數。有關grid_forget的信息,請訪問http://effbot.org/tkinterbook/grid.htm – 2014-12-11 03:04:36

+0

我認爲我仍然無法理解如何實施該破壞。林不知道如何通過列表中的號碼 – mGarsteck 2014-12-11 03:13:47

回答

1

看看這個。你的add是有點奇怪的設計(和不正確的國際海事組織),所以我稍微修改它以及其他部分。

from tkinter import * 


class App(object): 

    def __init__(self, master): 
     self.master = master 
     self.frame = Frame(master) 
     self.frame.grid() 
     self.addFrame = Frame(master) 
     self.addFrame.grid(row=0, column=0, columnspan=2, sticky='N') 
     self.listFrame = Frame(master) 
     self.listFrame.grid(row=1, column=0, columnspan=2, sticky='NW') 
     self.todoList = [] 
     self.buttonList = [] #<--- button list is here now 
     self.initUI() 

    def initUI(self): 

     self.entryBox = Entry(self.frame, width = 15) 
     self.entryBox.grid(row=0, column=0, sticky='N') 

     self.addButton = Button(self.frame, text="<-ADD->", command=self.add) 
     self.addButton.grid(row=0, column=1, sticky='N') 


    def removeCheckButton(self, button_no): 
     # - CONFUSED HOW TO REMOVE THE SPECIFIC CHECKBUTTON 
     # print(button_no, self.buttonList[button_no]) 
     #self.buttonList[button_no].grid_forget() 
     self.buttonList[button_no].destroy() 
     # del self.buttonList[button_no] 
     # del self.todoList[button_no] 


    def add(self): 
     entry = self.entryBox.get() 
     self.entryBox.delete(0, END) 
     self.todoList.append(entry) 
     print(self.todoList) 
     var1 = IntVar() 
     #self.buttonList = [] #<--- not sense having this here 
     # for n in range(len(self.todoList)): #<-- this for also very strange here. 
     n = len(self.buttonList) 
     lx = Checkbutton(self.listFrame, 
         text=self.todoList[n], 
         variable=self.todoList[n], 
         command=lambda ni=n: self.removeCheckButton(ni)) 
     lx.grid(row=n, column=0, sticky='NW') 
     self.buttonList.append(lx) 
     # print(self.buttonList) 


root = Tk() 
app = App(root) 
root.mainloop() 

P.S. 我使用python 3,但除了import part,代碼應該爲您執行。可能需要更多的修復,但複選框會按照他們的設想被破壞。

+0

感謝您的幫助! 只要修復,你還會提供什麼?我給了自己這個項目,以更好地學習該計劃。任何建議顯然都被接受。 – mGarsteck 2014-12-11 03:35:55

+0

不用擔心。我沒有詳細介紹該計劃的所有細節。我只專注於複選框的銷燬。檢查它是否有效,根據你的喜好進行修改,如果你有新的問題/問題,只是提出新的問題。一件很簡單的事情是,當你銷燬一個checkboox時,可能還需要從'self.todoList'和'self.buttonList'中去掉相關的元素。 – Marcin 2014-12-11 03:47:04

+0

我在checkbutton行上發現列表超出範圍錯誤 – mGarsteck 2014-12-11 03:59:45

相關問題