【问题标题】:Custom Tkinter Widget Won't Pack in Toplevel?自定义 Tkinter 小部件不会打包到顶层?
【发布时间】:2018-03-10 12:21:38
【问题描述】:

我正在尝试通过子类化 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 级别,以便更直接地看出哪个窗口是哪个窗口。

【问题讨论】:

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

标签: python tkinter


【解决方案1】:

top 不是您的自定义小部件的父级。你永远不会通过它。您的 Scrollygrid 正在传递一个 parent 参数,就是这样。 Nothing 告诉它甚至将其作为属性分配为父级。所以父级默认为Tk实例root。

替换:

super(Scrollygrid, self).__init__()

与:

super(Scrollygrid, self).__init__(parent)

为了将给定的小部件参数作为 父级传递给超类 Frame。基本上使Toplevel、top 成为您自定义类的父级。在此之后,您将收到更多错误,但父级已正确分配。验证人:

print(repr(self.winfo_toplevel()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多