我刚在Tkinter写了一个类,它允许我使一些小部件可拖动。只要窗口小部件的主人是根窗口,这确实很有用。但是,例如,如果我有一个带有Lable的框架,我可以拖动框架,但Lable就会消失。这是因为类将标签放在与主窗口相关的位置。因此,例如,如果Frame的大小为100x100,并且位于主窗口的500,500位置,并且我将Label(0,0)1px向右拖动,则将其放置在501,500而不是1 ,0导致类认为master是根窗口。所以现在我想只使用主人的位置从标签位置减去它(501-500,500-500> 1,0)只有一个问题。这个:
f = Frame(root, width=100, height=100, bg='grey')
f.place(x=500, y=500)
l = Label(f, text='Drag me!)
l.place(x=0, y=0)
master = l.master
print(master)
让我不是一个主人,而是两个人。即使只有一个打印声明,它也给了我:
>>.
>>.!frame
如果我在声明和打印之间放置一个睡眠声明,则需要更长的时间。但是,如果我检查类型它不是列表,这是两个对象。
任何人都能解释一下吗?我只需要一种方法来获得标签的主人来获得它的位置!
Tkinter小部件存在于树结构中,并且根处必须有Tk
的实例。如果您不创建一个,则会在您第一次创建窗口小部件时为您创建。
在你的输出中,“。”表示可能为您创建的根窗口,“。!frame”表示框架。
虽然,鉴于你明确地将root
传递给Frame()
这一事实,看起来你的代码在某处明确地创建了根窗口。
我发现了这个问题。这不是代码的问题。我只是没有注意到我也将框架拖拽了。并且导致Frames父级是root我得到了它。