2016-05-31 9 views
0

確認ボタンを押してコンボボックスで選択した時刻を思い出させるリマインダを作成します。私はラベルに時間を入れて、同じ行のラベルとボタン自体をループで削除できる削除ボタンを作成します。ラベルが1つしかない場合には機能しますが、ラベルの数を増やすと、最後のラベルとボタンが破棄されます。以下Tkinter破棄ボタンがループで作成される

は私のコードです:

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変数(または何でも)で行を追跡し、毎回1つずつインクリメントします。

+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() 
関連する問題