Почему есть два разных результата, если я отлаживаю или запускаю его? - PullRequest
1 голос
/ 08 февраля 2020

Я делаю простую функцию для загрузки веб-фотографии в tkinter. При сканировании фотографии на GUI отобразится подсказка «загрузка ...».

Когда она закончится, фотография закроет этот совет. Чтобы избежать зависания GUI во время сканирования, я использую для этого модуль threading.

Вот минимальный воспроизводимый пример.

import requests
import threading
import tkinter
from PIL import ImageTk,Image
from io import BytesIO

class MultiProcessGetResultWithoutArgs(threading.Thread): # get thread result
    def __init__(self, func):
        threading.Thread.__init__(self)
        self.func = func
        self.result = None

    def getResult(self):
        return self.result

    def run(self):
        self.result = self.func()

def GetOne():
    return Image.open(BytesIO(requests.get('https://s2.ax1x.com/2020/02/07/12usP0.th.jpg').content))

def checkWhetherGet(): # judge whether it has result.
    result = thread.getResult()
    if result:
        img1 = ImageTk.PhotoImage(result)
        tkinter.Label(w,image=img1).grid(row=0,column=0)
        w.update()
        w.after_cancel(1)
    else:
        w.after(100,checkWhetherGet)

def about():
    global w,thread
    w = tkinter.Toplevel()
    tkinter.Label(w,text="loading....").grid(row=0,column=0)
    thread = MultiProcessGetResultWithoutArgs(GetOne)
    thread.start() # non-block thread
    w.after(1000,checkWhetherGet)
    w.mainloop()

Win = tkinter.Tk()
tkinter.Button(Win,text="start",command=about).grid()
Win.mainloop()

Теперь, если я отлаживаю этот код , он может показать изображение. Но если я запустите этот код, он только увеличит размер окна, но не покажет изображение.

1 Ответ

0 голосов
/ 08 февраля 2020

Наконец-то я нахожу свою проблему. Как это сказал, я сохраняю ссылку. xx.image = img1 И решите мою проблему. Но что меня действительно смущает, так это то, что отладчик не будет использовать сборщик мусора.

...