При попытке добавить изображение, которое функционирует как кнопка, но эта ошибка, изображение "pyimage2" не существует, всплывает - PullRequest
2 голосов
/ 30 апреля 2019

У меня уже есть набор кода, который отформатирован так же, как приведенный ниже, и кажется, что он работает.Но каким-то образом изображение для этого не появляется.И они находятся в той же папке, что и код.Def small - это код с работающим изображением, а def stripes - ошибка.

from tkinter import *
import tkinter as tk
from tkinter import ttk

def small():
    s = Tk()
    s.title('Small Preset Shirt (Not fit to scale)')
    canvas = Canvas(s, width = 800, height = 100)
    canvas.pack()
    b1=ttk.Button(s,text='Click to Start', command = questions)
    b1.pack()
    photo = PhotoImage(file = 'small.png')
    b1.config(image=photo,compound=RIGHT)
    s.mainloop()

def stripes():
    stripes = Tk()
    stripes.title('Black Shirt with Stripes')
    canvas = Canvas(stripes, width = 800, height = 100)
    canvas.pack()
    b2=ttk.Button(stripes,text='Click to See Final Price', command = final)
    b2.pack()
    photo = PhotoImage(file = 'stripes.png')
    b2.config(image=photo,compound=RIGHT)
    stripes.mainloop()

Вот полный Traceback:

Exception in Tkinter callback
Traceback (most recent call last):
File              "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter        /__init__.py", line 1705, in __call__
return self.func(*args)
File "/Users/Business/Documents/Python/small.py", line 159, in  stripes
b2.config(image=photo,compound=RIGHT)
File  "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter.   /__init__.py", line 1485, in configure
return self._configure('configure', cnf, kw)
File   "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter.   /__init__.py", line 1476, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage2" doesn't exist

1 Ответ

0 голосов
/ 30 апреля 2019

Когда вы получаете сообщение об ошибке "_tkinter.TclError: image "pyimage2" doesn't exist" или что-то в этом роде, это означает, что tkinter не может решить, какая это фотография окна.Это связано с более чем одним Tk() окнами.Есть несколько других вещей, которые создают проблемы, когда вы используете более одного Tk, поэтому у Tkinter есть окно другого типа Toplevel, и оно ссылается на главное окно как дочернее окно.

Позволяет перейти к вашему коду ..

Здесь я вижу несколько других проблем, кроме этой ошибки.

  1. Мне нравитсяЯ сказал не более одного Tk() окна.Я полагаю, что у вас их больше двух.

  2. Если у вас есть главное окно и вы решили открыть еще несколько с помощью Toplevel, тогда, пожалуйста, не используйте другое mainloop(), достаточно одного для открытиястолько же окон Toplevel, но не забывайте использовать хотя бы один mainloop() в конце вашего кода.

  3. Иногда, когда вы определяете Photoimage в функции, которая хранит изображение влокальная переменная изображение очищается питоном, даже если оно отображается с помощью Label или Canvas.Поэтому всегда создавайте ссылку в этом случае.

Поскольку ваш код не работает, я добавил необходимые вещи для его запуска и тестирования.

from tkinter import *
from tkinter import ttk

Main_window = Tk()  # Make only one Tk main window 
Main_window.geometry('300x150')
Main_window.title("Get Shirts (Buy 1 get 1 Free)")

def small():
    s = Toplevel()   # For secondary window use Toplevel 
    s.title('Small Preset Shirt (Not fit to scale)')
    canvas = Canvas(s, width = 800, height = 100)
    canvas.pack()
    b1=ttk.Button(s,text='Click to Start', command = None)
    b1.pack()
    photo = PhotoImage(file = 'logo.png')
    b1.img_ref = photo      # Create a reference 
    b1.config(image=photo,compound=RIGHT)
    # s.mainloop()      # Don't use mainloop more than once


def stripes():
    stripes = Toplevel()  # For secondary window use Toplevel 
    stripes.title('Black Shirt with Stripes')
    canvas = Canvas(stripes, width = 800, height = 100)
    canvas.pack()
    b2=ttk.Button(stripes,text='Click to See Final Price', command = None)
    b2.pack()
    photo = PhotoImage(file = 'logo.png')
    b2.img_ref = photo      # Sometimes images in functions becomes garbage value.
    b2.config(image=photo,compound=RIGHT)
    # stripes.mainloop()      # Using two of these will do nothnig.


Category_Lb = Label(Main_window, text='Category', font=('',25))
Category_Lb.pack()

Cate_1 = ttk.Button(Main_window, text='Small Preset Shirt', command=small)
Cate_1.pack()

Cate_2 = ttk.Button(Main_window, text='Black Shirt with Stripes', command=stripes)
Cate_2.pack()


Main_window.mainloop()
...