Код Python tkinter не выполняется внутри функции

#python #function #tkinter #photoimage

#python #функция #tkinter #фотоизображение

Вопрос:

 def display_rain():
    rain_image = Image.open("./images/rain_jpeg.jpg")
    rain_resized = rain_image.resize((250,250), Image.ANTIALIAS)
    rain_tk = ImageTk.PhotoImage(rain_resized)
    rain_label = tk.Label(root, image = rain_tk)
    rain_label.grid(row = 0, column = 0)
    rain_label.pack()

display_rain()
  

Код отлично выполняется вне функции, но, похоже, вообще не выполняется внутри нее. Я попытался перезапустить Python и переименовать функцию.

Комментарии:

1. добавьте global root в первую строку функции и посмотрите, что произойдет. Кроме того, выберите либо pack , либо grid , а не оба. Кроме того, сохраните изображение в глобальном словаре с любыми другими изображениями, которые вы хотите загрузить. То, как вы это делаете, ваше изображение является основным кандидатом для сборки мусора.

2. Не могли бы вы, пожалуйста, быть более конкретными? Что именно происходит, когда он работает (например, что вы ожидаете, что он будет делать), и что происходит, когда этого не происходит? Есть ли какие-либо сообщения об ошибках?

3. @MichaelGuidry Это не будет иметь никакого значения

4. @AryanParekh — моя правка о сборке мусора, вероятно, будет выполнена.

5. @MichaelGuidry Я не уверен, потому что, я думаю, в root есть ссылка на эту метку, поэтому сборщику мусора не следует ее удалять….

Ответ №1:

Ваше изображение собирается как мусор. Это работает.

 import tkinter as tk
from PIL import Image, ImageTk


root = tk.Tk()
root.geometry("800x600")

#store all images in this dict so garbage collection will leave them alone
#it doesn't have to be named "images"; it just has to be a dict
images = dict()


def display_rain(row=0, column=0):
    #create and store the image if it doesn't exist
    if 'rain_tk' not in images:
        #unless you are making mips of this image you should probably  
        #~make it the proper size and get rid of the resize part
        image = Image.open("./images/rain_jpeg.jpg").resize((250,250), Image.ANTIALIAS)
        #you can add a name to reference the image by
        #this makes it cleaner than accessing the dict directly
        images['rain_tk'] = ImageTk.PhotoImage(image, name='rain')
        
    #make and return the label, in case you want to grid_forget it or change the image
    label = tk.Label(root, image='rain') #instead of image=images['rain_tk']
    label.grid(row=row, column=column)
    return label
    
#you can easily display this wherever you want by filling in the row and column arguments
#as an example, this would be displayed at row1 column2
rain_lbl = display_rain(1, 2)
      
root.mainloop() 
  

Комментарии:

1. Легенда, это работает отлично, и я никогда не знал, что вы можете передавать позиции в качестве параметров функции. Почему вы поставили * перед Images , это просто соглашение?

2. Использование [*SomeDict] эквивалентно SomeDict.keys()

3. На самом деле, это бесполезно, поскольку dicts уже проверяет содержимое внутри ключей, что означает a in some_dict.keys() == a in some_dict

4. @BlackBeans ~ лол, я всегда забываю, это key in dict: или value in dict так, я просто уточняю. Возможно, ваш комментарий запомнится мне как напоминание.

5.Еще раз здравствуйте, теперь изображение не отображается внутри функции, но, опять же, отлично работает вне функции. weather_main = 'Clouds' if weather_main '_tk' not in [*Images]: wow = tk.Label(root, text = 'its a match') wow.pack() image_1 = ImageTk.PhotoImage(Image.open("./images/" weather_main ".jpg")) Images["main_type"] = weather_main finale = tk.Label(root, image=image_1) finale.pack() wow = tk.Label(root, text = 'its a match') wow.pack()