Python 自定义Tkinter小部件赢得';你不能在顶层打包吗?

Python 自定义Tkinter小部件赢得';你不能在顶层打包吗?,python,tkinter,Python,Tkinter,我试图通过对一个框架进行子类化来创建一个包含项目的可滚动小部件,从而创建一个自定义Tkinter小部件。我有两个窗口,我的根窗口和顶级窗口,我需要我的自定义小部件打包到顶级窗口 我的问题是,尽管将“top”作为自定义小部件的父级,但它仍然打包在根窗口中。我尝试过其他小部件,它们可以很好地打包到顶级窗口 我的代码: from tkinter import * root = Tk() root.config(bg="#000000") root.wm_attributes("-alpha","0.

我试图通过对一个框架进行子类化来创建一个包含项目的可滚动小部件,从而创建一个自定义Tkinter小部件。我有两个窗口,我的根窗口和顶级窗口,我需要我的自定义小部件打包到顶级窗口

我的问题是,尽管将“top”作为自定义小部件的父级,但它仍然打包在根窗口中。我尝试过其他小部件,它们可以很好地打包到顶级窗口

我的代码:

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()
从tkinter导入*
root=Tk()
root.config(bg=“#000000”)
root.wm_属性(“-alpha”,“0.7”)
顶层=顶层()
top.config(bg=“#000001”)
top.wm_属性(“-topmest”,1)
top.wm_属性(“-transparentcolor”,“000001”)
top.wm_标题(“TOPLEVEL”)
类Scrollygrid(框架):
定义初始化(自、父、列、h、w):
超级(Scrollygrid,self)。\uuu初始化
self.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(高度=h*10,宽度=w,bg=“#FF0000”)
self.gridframe.pack_传播(0)
self.area.create_window((0,0),window=self.gridframe)
对于范围(500)内的i:
标签(self.gridframe,text=i).pack()
self.area.pack()
self.area.config(scrollregion=(self.area.bbox(“全部”))
self.scrollbar.config(命令=self.area.yview)
def onScroll(事件):
self.area.yview_滚动条(int(-1*(event.delta/60)),“单位”)
self.area.bind_all(“,onScroll)
self.scrollbar.pack_-forget()#滚轮仍然有效!
testgrid=Scrollygrid(顶部,1,root.winfo_屏幕高度()-80,root.winfo_屏幕宽度()-(root.winfo_屏幕宽度()/10))
testgrid.pack(侧=右,锚=中心)
root.mainloop()

透明的颜色和alpha级别被保留下来,以便更直观地显示哪个窗口是哪个窗口。

top
不是自定义小部件的父窗口。你永远不会通过它。正在向您的
Scrollygrid
传递一个
parent
参数,就这样。没有任何东西告诉它将其指定为父项作为属性。因此父级默认为
Tk
实例,
root

替换:

super(Scrollygrid, self).__init__()
与:

为了将给定的小部件参数作为父类传递给超类,
Frame
。本质上,使
顶级
顶级
成为自定义类的父类。您将收到更多错误,但父项已正确分配。通过以下方式验证:

print(repr(self.winfo_toplevel()))

top
不是自定义小部件的父级。你永远不会通过它。正在向您的
Scrollygrid
传递一个
parent
参数,就这样。没有任何东西告诉它将其指定为父项作为属性。因此父级默认为
Tk
实例,
root

替换:

super(Scrollygrid, self).__init__()
与:

为了将给定的小部件参数作为父类传递给超类,
Frame
。本质上,使
顶级
顶级
成为自定义类的父类。您将收到更多错误,但父项已正确分配。通过以下方式验证:

print(repr(self.winfo_toplevel()))

@我不知道你的意思。为了清晰起见,上面的代码是我实际程序的一个非常精简的版本。上面的代码本身确实产生了一个GUI。我不好,错过了
mainloop
@Nae我不知道你的意思。为了清晰起见,上面的代码是我实际程序的一个非常精简的版本。上面的代码本身确实产生了一个GUI。我的错,错过了
mainloop