Моя фотография Tkinter упакована, но отображается как пустая

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

Я также попытался упаковать его в свое главное корневое окно с успехом, что говорит о том, что это проблема окна верхнего уровня. Я просто не знаю, что это такое. Любые идеи?

Вот мой код:

    def show_topLevelWindow():

      from tkinter import ttk
      print("Entered to show results")
      window_linkedin = Toplevel(root)
      window_linkedin.geometry('1000x590')

      frame = Frame(window_linkedin)
      frame.pack()

      error_frame = tkinter.Frame(frame, highlightbackground="green", highlightcolor="green", highlightthickness=1)

      error_label = Label(frame, text="It appears there are no results for the selected country")
      error_label.config(font=("Helvetica Neue", 20))        

      im_error = Image.open("./ressources/images_gui/aw_snap.png")
      im_error = im_error.resize((500, 500), Image.ANTIALIAS)
      im_error = ImageTk.PhotoImage(file = "./ressources/images_gui/aw_snap.png")
      im_error_label = Label(frame, image=im_error)

      try:
          if ....:
          ....unimportant code ....
          else:
              error_label.pack(in_=error_frame)            
              im_error_label.pack(in_=error_frame)  
              error_frame.pack(anchor="center")          
      except Exception as e:
          error_label.pack(in_=error_frame)            
          im_error_label.pack(in_=error_frame)            
          error_frame.pack(anchor="center")

Упакованное изображение отображается как пустое


person JUAN RUIZ DE BUSTILLO    schedule 26.10.2018    source источник


Ответы (1)


Самая важная проблема, с которой вы столкнулись, это то, что ваше изображение не сохраняется для справки. если вы добавите global im_error в самый верх своей функции, ваше изображение будет видно.

Тем не менее, есть некоторые проблемы с вашим кодом, которые вы должны исправить.

Во-первых: не импортировать в функцию. Вместо этого напишите весь свой импорт в верхней части кода.

Во-вторых: я не уверен, почему вы делаете .pack(in_=error_frame). Это не то, что действительно когда-либо понадобится. Просто убедитесь, что ваша метка уже назначена правильному кадру. Аргумент in_ используется редко, и, вероятно, большинство людей никогда его не используют. Я здесь уже два года и впервые вижу, чтобы кто-то использовал этот аргумент.

В-третьих: вы не показали свой импорт для Tkinter, однако, исходя из того, как вы написали свой код, похоже, что вы это сделали:

import tkinter
from tkinter import *

Это излишество и не очень хорошая идея. Просто сделайте import tkinter as tk и убедитесь, что вы используете префикс tk. там, где он применяется.

Вот ваш код переделан:

import tkinter.ttk as ttk
import tkinter as tk
from PIL import ImageTk, Image



def show_toplevel_window():
    global im_error
    window_linkedin = tk.Toplevel(root)
    window_linkedin.geometry('1000x590')

    frame = tk.Frame(window_linkedin)
    frame.pack()

    error_frame = tk.Frame(frame, highlightbackground="green", highlightcolor="green", highlightthickness=1)
    error_frame.pack()

    error_label = tk.Label(frame, font=("Helvetica Neue", 20), text="It appears there are no results for the selected country")
    error_label.pack()  

    im_error = Image.open("./ressources/images_gui/aw_snap.png")
    im_error = im_error.resize((500, 500), Image.ANTIALIAS)
    im_error = ImageTk.PhotoImage(file = "./ressources/images_gui/aw_snap.png")
    im_error_label = tk.Label(error_frame, image=im_error)
    im_error_label.pack()

root = tk.Tk()
show_toplevel_window()
root.mainloop()
person Mike - SMT    schedule 26.10.2018
comment
Спасибо!! За решение и добрые советы :-) - person JUAN RUIZ DE BUSTILLO; 26.10.2018
comment
@JUANRUIZDEBUSTILLO рад помочь. - person Mike - SMT; 26.10.2018