问题描述
我正在制作自己的自定义菜单栏。我的工作正在进行中,但是最近我遇到了一个混乱。 这是我的代码:-
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,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,height=100)
在 init ()方法中,一切正常。如果我在弹出窗口methon中写了同样的东西(我刚刚在其中注释掉了),则出现以下错误。
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",line 1883,in __call__
return self.func(*args)
File "C:\Users\mishra\P_Menu.py",line 64,in evt
menu.popup(evt.x_root,height=400)
File "C:\Users\mishra\P_Menu.py",line 51,in popup
self.frame_one = fp(self.app,height=100)
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\ttk.py",line 740,in __init__
Widget.__init__(self,master,"ttk::frame",kw)
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\ttk.py",line 557,in __init__
tkinter.Widget.__init__(self,widgetname,kw=kw)
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",line 2567,in __init__
self.tk.call(
_tkinter.TclError: Layout RoundedFrame not found
与Lable相同
l1=Label(self.app,image=self.borderImage).pack()
在 init ()部分中,一切正常,但在弹出方法中出现以下错误。
Traceback (most recent call last):
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",in __call__
return self.func(*args)
File "C:\Users\mishra\P_Menu.py",in evt
menu.popup(evt.x_root,height=400)
File "C:\Users\mishra\P_Menu.py",line 53,in popup
l1=Label(self.app,image=self.borderImage).pack()
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",line 3143,in __init__
Widget.__init__(self,'label',cnf,kw)
File "C:\Users\mishra\AppData\Local\Programs\Python\python38-32\lib\tkinter\__init__.py",in __init__
self.tk.call(
_tkinter.TclError: image "pyimage1" doesn't exist
我想知道如何解决它,因为我想知道它背后的逻辑并在popup()方法中使用。 任何帮助将被申请。 谢谢!
解决方法
也许是因为popup
以Tk
的形式创建了一个新的self.app
实例,但是样式属于Tk
创建的第一个root = Tk()
实例。因此,第二个Tk
实例的子代无法识别它。也许您可以尝试将self.app = Tk()
更改为self.app = Toplevel()
以查看其是否有效?