Хобрук: Ваш путь к мастерству в программировании

Изображение на кнопке

Я ожидаю одинаковых результатов для обоих приведенных ниже сценариев.

Но я не получаю изображение на кнопке при выполнении Script 1. Однако Script 2 работает хорошо.

Сценарий 1

from Tkinter import *
  class fe:
    def __init__(self,master):
      self.b=Button(master,justify = LEFT)
      photo=PhotoImage(file="mine32.gif")
      self.b.config(image=photo,width="10",height="10")
      self.b.pack(side=LEFT)
root = Tk()
front_end=fe(root)
root.mainloop()

Сценарий 2

from Tkinter import *
root=Tk()
b=Button(root,justify = LEFT)
photo=PhotoImage(file="mine32.gif")
b.config(image=photo,width="10",height="10")
b.pack(side=LEFT)
root.mainloop()
28.11.2010

Ответы:


1

Единственная ссылка на объект изображения — это локальная переменная. Когда __init__ завершается, локальная переменная удаляется сборщиком мусора, поэтому изображение уничтожается. Во втором примере, поскольку образ создается на глобальном уровне, он никогда не выходит за пределы области видимости и, следовательно, никогда не подвергается сборке мусора.

Чтобы обойти это, сохраните ссылку на изображение. Например, вместо photo используйте self.photo.

28.11.2010
  • Я застрял на одном и том же, и ваш ответ сработал как шарм. Спасибо @BryanOakley! 04.01.2016
  • Не могу заставить его работать, даже при использовании self.photo... Может ли разница быть в Python 3??? 20.03.2020
  • @rlinner: нет, между Python 2 и Python 3 ничего не изменилось в отношении изображений. 20.03.2020

  • 2

    это работает

    x1=Button(root)
    photo=PhotoImage(file="Re.png")
    x1.config(image=photo,width="40",height="40",activebackground="black"
    ,bg="black", bd=0,command=sil)
    x1.place(relx=1,x=5, y=-5, anchor=NE)
    

    но это бесполезно

    def r():
        x1=Button(root)
        photo=PhotoImage(file="Re.png")
        x1.config(image=photo,width="40",height="40",activebackground="black",
        bg="black", bd=0,command=sil)
        x1.place(relx=1,x=5, y=-5, anchor=NE)
    
    r()
    
    11.11.2017

    3

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

    from PIL import Image, ImageTk
    
    image = Image.open("path/to/image.png")
    image = image.resize((25, 25), Image.ANTIALIAS)
    self.reset_img = ImageTk.PhotoImage(image)
    self.button = tk.Button(frame, image=self.reset_img)
    
    24.04.2020

    4

    из импорта tkinter *

    root= Tk()
    
    btnPlay = Button(root)
    btnPlay.config(image=imgPlay, width="30", height="30")
    btnPlay.grid(row=0, column=0)
    
    root.mainloop()
    
    28.03.2020

    5
  • почему вы назначаете photo, а затем не используете его? 23.05.2019
  • Новые материалы

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..

    Случай использования npm3 вместо npm2 для разработки библиотеки
    Некоторое время назад я создал библиотеку на NodeJS, чтобы упростить рендеринг на стороне сервера и клиента. Он использует React и React Router для отображения соответствующего HTML на веб-сайте...