2015-03-24 2 views
0

Я пытаюсь сделать свой пользовательский интерфейс (который обычно выполняет другие действия, это версия barebones), обновляет метку изображения с веб-ресурса. Когда вы нажимаете кнопку, все окно увеличивается вместо заменяемого изображения. Я думал, что мой призыв к пакету позаботится об этом, но, видимо, нет.Изменение ярлыка изображения динамически приводит к увеличению всего окна.

Спасибо за ввод!

from Tkinter import * 
import base64 
import urllib2  

BTNTEXT_NEW_COMIC = "New Comic"  

def get_random_xkcd(): 
    COMIC_PREFIX = 'http://imgs.xkcd.com/comics/' 
    response = urllib2.urlopen('http://c.xkcd.com/random/comic/') 
    html = response.read() 
    if COMIC_PREFIX in html: 
     index = html.find(COMIC_PREFIX) 
     substring = html[index:] 
     endquote = substring.find("\"") 
     url = substring[:endquote] 
     return url 
    else: 
     return  

class LoggerWindow: 
    def __init__(self, master): 
     global frame 
     frame = Frame(master) 
     frame.pack()  

     self.newcomic_button = Button(frame, text=BTNTEXT_NEW_COMIC, command=self.new_xkcd) 
     self.newcomic_button.pack(side=LEFT)  

     self.new_xkcd()  

    def new_xkcd(self): 
     global frame 
     url = get_random_xkcd() 
     print url 
     u = urllib2.urlopen(url) 
     raw_data = u.read() 
     u.close() 
     b64_data = base64.encodestring(raw_data) 
     self.xkcd_image = PhotoImage(data=b64_data) 
     self.xkcd_label = Label(image=self.xkcd_image) 
     self.xkcd_label.pack()  


root = Tk() 
app = LoggerWindow(root)  

root.mainloop() 

ответ

3

Вы должны быть в состоянии назвать self.xkcd_label.configure(image=self.xkcd_image) вместо того, чтобы создать новый образ, как вы делаете. Если это не сработает, попробуйте позвонить self.xkcd_label.pack_forget(), чтобы удалить ярлык перед его переупаковкой.

+0

Bingo! Настроить был маршрут, я даже не пытался pack_forget. –

+1

Вызов 'pack_forget' только удаляет его из представления. Он все еще занимает память. –

+0

Хорошая точка. Я предложил 'pack_forget' удалить его из окна, которое решило бы описанную проблему. Я полагаю, что 'destroy()' будет лучшим способом удалить его из памяти. – Keith