2016-10-25 1 views
-1

Итак, я новичок в tkinter, но у меня есть то, что я хочу работать, до определенного момента. Я не уверен, что правильно настроил его, но у меня есть карта мира с кнопками справа, а журнал событий слева, который заполняется ярлыками, как это происходит. Проблема заключается в том, что через некоторое время весь журнал заполняется. Каков наилучший способ удалить все ярлыки или, возможно, удалить самую старую (верхнюю) метку каждый раз? Вот что я имею в виду:Очистка всех ярлыков от окна tkinter

enter image description here

Определено здесь:

root=Tk() 
Map=PhotoImage(file="C:/Users/Willam/Desktop/CWProgram/map2.gif") 
background=Label(root,image=Map).place(x=100,y=0,relwidth=1,relheight=1) 
Title=Label(root,text='      LOG').pack(anchor=NW) 

И я создаю свои метки, как это:

info=Label(root,text='Select a sector to move units from',wraplength=170) 
info.pack(anchor=NW) 

Я попробовал обычную info.destoy() и info.forget(), но они работать только с последней меткой, используемой в этой функции. Должен ли я сгруппировать все ярлыки или что-то еще?

+1

очень распространенная ошибка 'var = Widget(). Pack()' вы оцениваете значение 'var', возвращаемое' pack() ', а не' Widget() '. Вам нужны два шага: var = Widget() 'и' var.pack() '. То же самое с 'place()' (и 'grid()', если вы будете использовать в будущем). – furas

+2

Я предлагаю добавить ваши ярлыки в список. Это позволяет легко убивать (или перерабатывать) самые старые. –

+0

Возможный дубликат [Tkinter: AttributeError: NoneType-объект не имеет атрибута get] (http://stackoverflow.com/questions/1101750/tkinter-attributeerror-nonetype-object-has-no-attribute-get) – Lafexlos

ответ

1

Как PM 2Ring предположил, что это, как правило, полезно добавить ярлыки в список для будущего исх:

tmp = Label(...) 
labels.append(tmp) 

то просто:

foreach label in labels: label.destroy() 

Если вы не хотите список, и вы» повторно, что вы хотите, чтобы очистить все в корне:

foreach label in root.children.values(): label.destroy() 

Дети dict всегда содержат объекты, содержащиеся внутри. Если вы хотите сохранить метку карты, вам нужно будет сделать свой собственный список, как я показал, не добавляя в него info.

+0

Спасибо, что все отлично работает, excapt фактически удаляет каждый элемент, я получаю эту ошибку: –

+0

AttributeError: объект «NoneType» не имеет атрибута «destroy». Означает ли это, что я не правильно определил этикетки? –

+0

@ комментарий W.Hunt furas и связанный с ним вопрос в комментариях объясняют эту ошибку. – Lafexlos

0

Я рекомендовал бы использовать:

info.pack_forget() 

Для каждой упаковки вы создали вы должны сделать это в формате:

packname.pack_forget() 

Что, если у вас есть много пакетов нецелесообразно, но в остальном это работает очень хорошо.

Это также очень удобно выборочно удалять некоторые ярлыки и оставлять других, поскольку они не будут очищать все упакованные вами пакеты.

Смежные вопросы