#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()
, чтобы посмотреть, работает ли это?