Макет в стиле Ttk не найден, как исправить?

#python-3.x #tkinter #layout #ttk #ttkwidgets

#python-3.x #tkinter #макет #ttk #ttkwidgets

Вопрос:

Я создаю свою собственную панель меню.Моя работа находится в процессе, но недавно я столкнулся с одной путаницей. Вот мой код:-

 from tkinter import *
from tkinter.ttk import Style,Frame as fp
class menu():
    def __init__(self,parent,bg="#ffffcc"):
        self.parent = parent
        self.bg = bg
        #this is a image in base 64 encoded format
        borderImageData='''
                            iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC aJAAAABmJLR0QA/wD/
                            AP gvaeTAAACZ0lEQVRoge2aPU/TURSHn/MvpbYYKa9qQQnlTSOJRBzoYBDi
                            YEwcdPFD PIFHHRxcCXxO7gxmBgXSTcxMYQEE4spoEWIvBcDBfp2HVqlxRhK
                            TDwtuc947vJ7cnPvGc6R/v5 KhlHO8C/YgW0sQLaWAFtqg4WxKEjJMGQaQyK
                            txbHpZGqmGzG7GzKyoyZfcfsOCZbeChFjaz vAw/oq6V1K75HiERJ5v 33H/
                            xKnC55czF3CfYD1mxkbY Pb7sECguUtuPQbMh5d8eksmpZL2r7jccvEGV  B
                            Ma fsRzNlwOBAID3lNx gjHm1VNiEweuqSwwWZajxCak85oEQ3wOk0my/4j7
                            7uD1m7ERNuY1Ux7KeozwC3x uXI3V3AAXFXSPcjCFAtTmuFKw8xPsviRrsHc
                            B MANHVS7WPuvXK0kjGz43hqaOogL3CyASC oJrqKMQXAWoayQmI2wuY1J5q
                            qKOQ2gXE4 MYdGIroI0V0MYKaGMFtLEC2lgBbayANlZAGyugjRXQxgpoYwW0
                            sQLaWAFtrIA2DmCSCQC3RzlL6VR7AZIJ8jewtQaIv0Uz05GoPQuYrVXyAqsz
                            JBO0D imKh0JhtjbYmWGvEAmbabDtPTSelk5Wimc6yNwiekw2Qz7j3hylERc
                            hh9S36YZ7jCkoU2GHpjtdTM5mqv8mtSnkyxFpHtQeoZIJ1n7UnbDelc1vTfl
                             n1EePOcH0u5cvGyR11r/hJSeyxFzPZGmSx7SE09p3twe1j7asZGCifCcnDt
                            UhzaBwgOSHMnZbNuw86mWY7K3Lg5ZN2mAjkWnbiisQLaWAFtKl7gJzIjtMOb
                            uqQwAAAAAElFTkSuQmCC
                            '''         
        self.borderImage = PhotoImage( data=borderImageData,master=self.parent)
        self.TP_style=Style()
        self.TP_style.element_create("RoundedFrame",
                     "image", self.borderImage,
                     border=14, sticky="nsew")
        self.TP_style.layout("RoundedFrame",
                         [("RoundedFrame", {"sticky": "nsew"})])
        self.frame_one = fp(parent, style="RoundedFrame", padding=10,width=100,height=100)
        self.frame_one.pack()
        l1=Label(parent,image=self.borderImage).pack()
    def popup(self,x,y,width=110,height=120):
        self.width=width
        self.height=height
        self.app = Tk()
        self.app.config(bg=self.bg)
        self.app.geometry(f"{self.width}x{self.height} {x} {y}")
        self.app.wm_attributes("-topmost",True)
        self.app.overrideredirect(True)
        self.app.focus_force() 
        #self.frame_one = fp(self.app, style="RoundedFrame", padding=10,width=100,height=100)
        #self.frame_one.pack()
        #l1=Label(self.app,image=self.borderImage).pack()
        #self.m.pack_propagate(0)
        def destroy(event):
            self.app.destroy()
        self.app.bind("<FocusOut>",destroy)
if __name__ == "__main__":
    root = Tk()
    menu = menu(root)
    def evt(evt):
        menu.popup(evt.x_root,evt.y_root,width=200,height=400)     
    root.bind("<Button-3>",evt)
    root.mainloop()
     
  

Если я напишу стиль для фрейма, например

 self.frame_one = fp(parent, style="RoundedFrame", padding=10,width=100,height=100)
  

в методе init() все работает нормально. Если то же самое, что я пишу во всплывающем окне methon (где я только что прокомментировал), я получил следующую ошибку.

 Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinter__init__.py", line 1883, in __call__
        return self.func(*args)
      File "C:UsersmishraP_Menu.py", line 64, in evt
        menu.popup(evt.x_root,evt.y_root,width=200,height=400)
      File "C:UsersmishraP_Menu.py", line 51, in popup
        self.frame_one = fp(self.app, style="RoundedFrame", padding=10,width=100,height=100)
      File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinterttk.py", line 740, in __init__
        Widget.__init__(self, master, "ttk::frame", kw)
      File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinterttk.py", line 557, in __init__
        tkinter.Widget.__init__(self, master, widgetname, kw=kw)
      File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinter__init__.py", line 2567, in __init__
        self.tk.call(
    _tkinter.TclError: Layout RoundedFrame not found
  

То же самое для ярлыка

 l1=Label(self.app,image=self.borderImage).pack()
  

В разделе init() все работает нормально, но во всплывающем методе я получил следующую ошибку.

 Traceback (most recent call last):
  File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinter__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:UsersmishraP_Menu.py", line 64, in evt
    menu.popup(evt.x_root,evt.y_root,width=200,height=400)
  File "C:UsersmishraP_Menu.py", line 53, in popup
    l1=Label(self.app,image=self.borderImage).pack()
  File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinter__init__.py", line 3143, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:UsersmishraAppDataLocalProgramsPythonPython38-32libtkinter__init__.py", line 2567, in __init__
    self.tk.call(
_tkinter.TclError: image "pyimage1" doesn't exist    
  

Я хочу знать, как это исправить, потому что я хочу знать логику, стоящую за этим, и использовать метод popup ().
Любая помощь будет оценена.
Спасибо!

Ответ №1:

Может быть, это потому popup , что создается новый Tk экземпляр as self.app , но стиль принадлежит первому Tk экземпляру, созданному root = Tk() . Таким образом, дочерний элемент второго Tk экземпляра не может его распознать. Может быть, вы можете попробовать изменить self.app = Tk() self.app = Toplevel() , чтобы посмотреть, работает ли это?