TclError: изображение не существует - Tkinter multi-windows python - PullRequest
0 голосов
/ 28 ноября 2018

Прежде чем меня попросят просмотреть другие темы, я просто хочу сказать, что у меня есть, и все решения включают вызов tk.Toplevel() вместо tk.TK() или находятся в одном и том же .py файле.Я пытался это сделать (возможно, неправильно, заменив HAS(tk.Tk) на HAS(tk.Toplevel).

. В моем коде появляется ошибка TclError: image "brand_logo.png" doesn't exist. Я разрабатываю программное обеспечение Tkinter с некоторыми окнами для пользователя, чтобыНавигация по каждому окну будет иметь набор вопросов, на которые нужно ответить. Для удобства обслуживания я разработал каждое окно в отдельном файле, чтобы можно было отслеживать более простые ошибки и изменения в самих окнах.

Кодмой класс создания окон:

import tkinter as tk, Questions1 as q1, Questions2 as q2
class HAS(tk.Tk):    
def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, *kwargs)
    #Page configure
    tk.Tk.wm_title(self, "Checklist")
    container = tk.Frame(self)
    container.pack(side="top", fill="both", expand=True)
    container.grid_rowconfigure(0, weight=1)
    container.grid_columnconfigure(0, weight=1)
    container.configure(background = "white")

    #Adding overhead menu
    menubar = tk.Menu(container)
    filemenu = tk.Menu(menubar, tearoff = 0)
    filemenu.add_command(label = "Save", command = self.saveList)
    filemenu.add_command(label = "Exit", command= self.destroy)
    menubar.add_cascade(label="File", menu=filemenu)
    tk.Tk.config(self, menu=menubar)

    #Defining the page_frames
    self.frames = {}
    for F in (q1.Q1, q2.Q2):
        frame = F(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky="nsew")
    self.show_frame(q1.Q1)

#showing the selected frame              
def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise()

# Function accessing the list of answers
def saveList(self):
    dict_answers={'Answers 1': self.frames[q1.Q1].list_answers, "Answers 2": self.frames[q2.Q2].list_answers}
    print(dict_answers)

app = HAS() 
app.geometry("530x700")
app.mainloop()

, и каждая из моих анкет строится по той же структуре, просто меняя текст и вопросы:

class Q1(tk.Frame):
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.columnconfigure(0, minsize=100)
    self.columnconfigure(1, minsize=150)
    self.columnconfigure(2, minsize=50)     
    Logo = tk.PhotoImage("brand_logo.png")
    #Header Config
    tk.Frame.configure(self, background = "white")
    ttk.Label(self, image=Logo, background="white").grid(row=0, column=0, padx=100, columnspan=3, pady=10, sticky="W")
    ttk.Label(self, text="1st Checklist", font = FONT, background = "white").grid(row=1, column=0, columnspan=3, pady = 10)
    ttk.Label(self, text="Questions: ", background="white").grid(row=2, column=0,columnspan=2, padx=10, pady = 10, sticky="W")

    #Questions
    global qt
    qt = [tk.StringVar(self) for i in range(len(Questionlist_a))]
    for r in range(len(Questionlist_a)): 
        ttk.Label(self, text=Questionlist_a[r], background = "white").grid(row= r+3, column=0, columnspan=2, padx=10, pady = 10, sticky="W")
        ttk.OptionMenu(self, qt[r], *choices_y_n).grid(row = r+3, column=2, padx=10, sticky="WE")
        r=+1

    #Buttons  
    ttk.Button(self, text="Save values", command = self.save_values, width=18).grid(row=16, column=0, padx=10, pady=15, sticky="W")
    ttk.Button(self, text="Questions 2", command = lambda: controller.show_frame(__import__('Questions2').Q2),width=18).grid(row=17, column=0, padx=10, pady=15, sticky="W")

    # List of answers
    self.list_answers=[]

def save_values(self):
    self.list_answers = list(map(lambda x: x.get(), qt))

Полная ошибка отслеживания:

Traceback (most recent call last):
File "<ipython-input-3-69ca257aaadd>", line 1, in <module>
runfile('C:/Users/nlcaste9/Desktop/New folder/Main.py', wdir='C:/Users/nlcaste9/Desktop/New folder')

File "\WPy-3662\python-3.6.6.amd64\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
execfile(filename, namespace)

File "C:\Users\nlcaste9\Downloads\WPy-3662\python-3.6.6.amd64\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/nlcaste9/Desktop/New folder/Main.py", line 49, in <module>
app = HAS()

File "C:/Users/nlcaste9/Desktop/New folder/Main.py", line 33, in __init__
frame = F(container, self)

File "C:\Users\nlcaste9\Desktop\New folder\Questions1.py", line 25, in __init__
ttk.Label(self, image=Logo, background="white").grid(row=0, column=0, padx=100, columnspan=3, pady=10, sticky="W")

File "C:\Users\nlcaste9\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\ttk.py", line 761, in __init__
Widget.__init__(self, master, "ttk::label", kw)

File "C:\Users\nlcaste9\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\ttk.py", line 559, in __init__
tkinter.Widget.__init__(self, master, widgetname, kw=kw)

File "C:\Users\nlcaste9\Downloads\WPy-3662\python-3.6.6.amd64\lib\tkinter\__init__.py", line 2296, in __init__
(widgetName, self._w) + extra + self._options(cnf))

TclError: image "brand_logo.png" doesn't exist

Кто-нибудь может мне помочь?

Спасибо!

1 Ответ

0 голосов
/ 28 ноября 2018

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

Класс PhotoImage __init__Метод определяется как

class PhotoImage(Image):
    """Widget which can display colored images in GIF, PPM/PGM format."""
    def __init__(self, name=None, cnf={}, master=None, **kw):
        """Create an image with NAME.

        Valid resource names: data, format, file, gamma, height, palette,
        width."""
        Image.__init__(self, 'photo', name, cnf, master, **kw)

Это означает, что первый аргумент - name.Поэтому, когда вы вызываете Logo = tk.PhotoImage("brand_logo.png"), вы создаете изображение с именем brand_logo.png, но без указания того, какой файл изображения следует использовать.Чтобы указать файл изображения, используйте аргумент ключевого слова file:

Logo = tk.PhotoImage(file="brand_logo.png")

С учетом этого, Logo по-прежнему является локальной переменной для функции __init__, поэтому после этого возвращается Logo будет собирать мусор.Чтобы предотвратить это, сделайте его переменной экземпляра, переименовав его в self.Logo везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...