【问题标题】:Python Tkinter parenting problem of an instancePython Tkinter 实例的育儿问题
【发布时间】:2021-11-13 03:39:15
【问题描述】:

我有框架类 A 和 B, B 类是在 A 类中“创建”的, A 的父级是“self”。

问题:结果表明 B 在 A 之外。 没有出现错误。

在另一篇文章中回答说小部件返回无。 所以默认选择根窗口。

但 print(instance B) 返回 ".!instance B name" 而不是 None。

这是代码:

import tkinter as tk

# class B
class Frm_btn(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, width=24, height=24, bg="green")
        self.parent=parent

# class A
class Frm_tool(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self, width=48, height=48, bg="blue")
        self.parent=win

        # instance of class B
        self.frm_btn=Frm_btn(self)
        self.frm_btn.pack()

        print(self)# return ".!frm_tool"
        print(self.frm_btn)# return ".!frm_btn"


win=tk.Tk()
win.configure(bg="red")

# instance of class A
frm_tool=Frm_tool()
frm_tool.pack()

win.mainloop()

【问题讨论】:

  • 不能只设置self.parent,需要在tk.Frame.__init__调用后添加self
  • 谢谢您的回答

标签: python class tkinter instance parent


【解决方案1】:

你似乎有点困惑。位置参数 master 默认设置为第一个参数。 示例:

b = tk.Button() #master is the root window by default 
b.pack()

b2= tk.Button(my_frame) #master is set to my_frame

构造函数返回的引用不是None,如所述。每个函数都返回 None ,这就是 python 的工作原理。

例如:

b = tk.Button()
c = b.pack()
print(c)

另请注意,如果您将变量分配给函数或方法返回的内容,则最后返回的值将分配给您的变量。 所以这段代码:

b = tk.Button().pack()

与此代码相同:

b = tk.Button() #returns a reference
b = b.pack() #returns None

正如@MegaIng 已经向您指出的那样。如果你想在继承类中设置主人,你必须明确地这样做。例如:

class Frm_btn(tk.Frame): 
    def __init__(self, parent): 
        tk.Frame.__init__(self,parent, width=24, height=24, bg="green") 
        self.parent=parent

【讨论】:

  • 谢谢您的回答
  • 我按照建议重写了代码(两个框架),但现在父框架 (frm_tool) 不可见。我正在努力
  • 我无法让它工作......当“Frm_btn”被实例化时,“frm_tool”不在这里。当它不是 frm_tool 时是可见的。
  • 我设法让它与您的两个建议一起工作并用小部件填充“Frm_btn”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多