2016-05-31 5 views
0

Я хочу создать напоминание, чтобы напомнить мне о времени, которое я выбрал в поле со списком, нажав подтвержденную кнопку. Я помещаю время в метку, а также создаю кнопку удаления, которая может удалить ярлык и кнопку в одной строке с помощью цикла. Он работает, если есть только один ярлык, но если я увеличил его количество, он может уничтожить только последнюю метку и кнопку.Tkinter destroy button create by loop

ниже мой код:

class final: 
    def __init__(self,app): 
     self.savelist=[] 

     self.time= StringVar() 
     self.timecombo = ttk.Combobox(app,textvariable=self.time) 
     self.timecombo.grid(row=0,column=1) 
     self.timecombo.config(value =('1:00','2:00','3:00','4:00','5:00','6:00','7:00','8:00','9:00','10:00','11:00','12:00')) 

     self.button1=Button(app,text='confirmed',command=self.save) 
     self.button1.grid(row=3,column=2) 


    ***def save(self): 
     savetext = self.time.get() 
     self.savelist.append(savetext) 
     self.deletebutton_list = [] 
     self.savelabel_list = [] 
     for i in range(len(self.savelist)): 
      savelabel = Label(app, text=self.savelist[i]) 
      savelabel.grid(row=4 + i, column=0) 
      self.savelabel_list.append((savelabel)) 
      deletebutton = Button(app, text='delete' , command=functools.partial(self.deletelabel,idx=i)) 
      deletebutton.grid(row=4 + i, column=1) 
      self.deletebutton_list.append(deletebutton) 
    def deletelabel(self, idx): 
     self.savelabel_list[idx].destroy() 
     self.deletebutton_list[idx].destroy() 
     self.savelist.remove(self.savelist[idx]) 
     self.savelabel_list.remove(self.savelabel_list[idx]) 
     self.deletebutton_list.remove(self.deletebutton_list[idx])*** 

app = Tk() 
a = final(app) 
app.title('things to do') 
app.geometry("500x300+200+200") 

app.mainloop() 

Я считал, что должно быть что-то не так в цикле или функцию deletelabel, но я до сих пор не могу это исправить.

ответ

0
self.savelabel_list.remove(self.savelabel_list[idx]) 

Не изменяйте этот список. Если вы удалите ярлык/кнопку # 1, метка №2 станет # 1, и поэтому, когда вы нажимаете кнопку для удаления метки # 2, она удаляет метку № 3, потому что все перемещено вверх. Также обратите внимание, что каждый раз, когда вы вызываете «save()», он создает новый набор виджетов, которые перекрывают старые виджеты, что в конечном итоге замедлит работу компьютера. Создайте и настройте только новую метку времени. Следите за строкой с переменной self.next_row (или любым другим) и каждый раз увеличивайте ее на единицу.

+0

спасибо за ваш ответ, но даже если я удалить столбец вы рекомендуемые, я до сих пор не могу достичь своей цели, и я не знаю, как клеть и сетки новой метки времени только, так Я новичок в python. Не могли бы вы написать код для меня? спасибо. –

+0

, и я думаю, что я уже решил проблему, о которой вы упоминали, используя functools.partial, потому что я могу увидеть правильный порядок метки/кнопки в списке после того, как я нажму. –

0

Это вопрос, который указывает, насколько полезны классы. Создайте новый класс с ярлыком и кнопкой закрытия для каждого напоминания.

from tkinter import * 
from tkinter import ttk 

class NewButton: 
    def __init__(self, master, label_text, this_row): 
     ## put everything in a new frame so destroying 
     ## one frame will destroy everything in it 
     self.fr=Frame(master) 
     self.fr.grid(row=this_row, column=1) 

     Label(self.fr, text=label_text).grid(row=0, column=1) 
     Button(self.fr, text="Close This", 
       command=self.fr.destroy).grid(row=0, column=2) 

class Final: 
    def __init__(self,app): 
     self.app=app 
     self.this_row=4 

     self.time_var= StringVar() 
     self.timecombo = ttk.Combobox(app,textvariable=self.time_var) 
     self.timecombo.grid(row=0,column=1) 

     self.button1=Button(app,text='confirmed',command=self.save) 
     self.button1.grid(row=3,column=2) 


    def save(self): 
     save_text = self.time_var.get() 
     self.this_row += 1 
     next_button=NewButton(self.app, save_text, self.this_row) 
     self.time_var.set("") 

app = Tk() 
a = Final(app) 
app.title('things to do') 
app.geometry("500x300+200+200") 

app.mainloop()