我尝试通过继承Frame来制作包含项目的可滚动窗口小部件来创建自定义Tkinter窗口小部件。我有2个窗口,我的根窗口和顶层窗口,我需要我的自定义小部件打包到顶层窗口。
我的问题是,尽管做了顶级'我的自定义小部件的父级,它仍然包含在根窗口中。我已经尝试过其他小部件,他们可以很好地打包到顶层窗口。
我的代码:
from tkinter import *
root = Tk()
root.config(bg="#000000")
root.wm_attributes("-alpha","0.7")
top = Toplevel()
top.config(bg="#000001")
top.wm_attributes("-topmost",1)
top.wm_attributes("-transparentcolor","#000001")
top.wm_title("TOPLEVEL")
class Scrollygrid(Frame):
def __init__(self, parent, columns, h, w):
super(Scrollygrid, self).__init__()
self.scrollbar = Scrollbar(self)
self.scrollbar.pack(side = RIGHT, fill = Y)
self.area = Canvas(self, yscrollcommand=self.scrollbar.set, width = w, height = h, bg = "#000001", bd = 0, highlightthickness = 0)
self.gridframe = Frame(height = h*10, width = w, bg = "#FF0000")
self.gridframe.pack_propagate(0)
self.area.create_window((0, 0), window = self.gridframe)
for i in range(500):
Label(self.gridframe, text = i).pack()
self.area.pack()
self.area.config(scrollregion = (self.area.bbox("all")))
self.scrollbar.config(command = self.area.yview)
def onScroll(event):
self.area.yview_scroll(int(-1*(event.delta/60)), "units")
self.area.bind_all("<MouseWheel>", onScroll)
self.scrollbar.pack_forget() #scroll wheel still works!
testgrid = Scrollygrid(top, 1,root.winfo_screenheight()-80,root.winfo_screenwidth()-(root.winfo_screenwidth()/10))
testgrid.pack(side = RIGHT, anchor = CENTER)
root.mainloop()
已经留下了透明的颜色和alpha级别,以便更明显地显示哪个窗口是哪个。
答案 0 :(得分:2)
top
不是自定义小部件的父级。你永远不会传递它。您的Scrollygrid
传递了parent
参数,而传递了。 Nothing 告诉它将其作为属性分配为偶数。因此,父默认到Tk
实例root
。
替换:
super(Scrollygrid, self).__init__()
使用:
super(Scrollygrid, self).__init__(parent)
为了将给定的小部件参数作为 父级传递给超类Frame
。基本上是Toplevel
,top
您的自定义类&#39;家长。您将获得进一步的错误,但父正确已分配。通过以下方式验证:
print(repr(self.winfo_toplevel()))