Canvas 将小部件放在画布上Tkinter

Canvas 将小部件放在画布上Tkinter,canvas,tkinter,widget,Canvas,Tkinter,Widget,我试图在GUI中设置一个背景图像,但我无法将我的小部件放置在画布上。我读过一些类似的帖子,我了解到我需要让我的小部件成为画布上的孩子,这是一个棘手的部分,因为我一直在尝试,但是,我想不出来。到目前为止,我有这个 import tkinter as tk from tkinter import * class Layout(tk.Frame): def __init__ (self, master=None): super().__init__(master)

我试图在GUI中设置一个背景图像,但我无法将我的小部件放置在画布上。我读过一些类似的帖子,我了解到我需要让我的小部件成为画布上的孩子,这是一个棘手的部分,因为我一直在尝试,但是,我想不出来。到目前为止,我有这个

import tkinter as tk
from tkinter import * 

class Layout(tk.Frame):
    def __init__ (self, master=None):
        super().__init__(master) 
        self.master= master
        self.pack()
        self.my_widget()

    def my_widget(self):

      self.C1 = Canvas(height=500, width=400)
      self.C1.place(height=1, width=3, anchor=NW)
      bgi= PhotoImage(file='bgi.png')
      self.C1.create_image(0,0,image=bgi,anchor=NW)
      self.buttonhc=tk.Button(self, height=1, width=3, bd=0.4, background='green')
      self.buttonhc["text"] = "HC"
      self.buttonhc.grid(row=3, column=2, pady=(100,2), padx=(5,5))


root=tk.Tk()
C = Canvas(root, height=500, width=400)
C.master.geometry("500x400")
C.master.maxsize(500, 400)
C.pack(expand=YES, fill=BOTH)
bgi= PhotoImage(file='bgi.png')
C.create_image(0,0,image=bgi,anchor=NW)
app = Layout(master=C)
app.mainloop() 
我之所以使用一个类是因为我在学习OOP,但实际上我认为它使代码变得比实际更复杂。请帮我解决这个问题,我有点受困了


提前谢谢

小部件只能是单个父/主部件的子部件,但让父部件成为根部件、画布或任何其他小部件实际上没有什么区别

在您的特定情况下,在调用
Layout
时,您可以将
C
作为主控传递:

app = Layout(master=C)
考虑到
Layout
中的所有内容都是
Layout
的后代,这将很好地工作


如果您觉得不方便,另一种解决方案是使用
place
将画布放在根窗口上,然后像往常一样创建您想要的所有其他小部件。使用
place
,并在任何其他小部件之前创建画布,将允许您在根窗口中正常使用
pack
grid
,它们都将显示在画布的顶部。

小部件只能是单个父/主部件的子部件,但是让父节点成为根节点、画布或任何其他小部件都没有什么区别

在您的特定情况下,在调用
Layout
时,您可以将
C
作为主控传递:

app = Layout(master=C)
考虑到
Layout
中的所有内容都是
Layout
的后代,这将很好地工作



如果您觉得不方便,另一种解决方案是使用
place
将画布放在根窗口上,然后像往常一样创建您想要的所有其他小部件。使用
place
,并在任何其他小部件之前创建画布,将允许您在根窗口中正常使用
pack
grid
,它们都将显示在画布顶部。

您是否尝试过将
布局(master=root)
更改为
布局(master=C)
?是的,但它不起作用,因为如果我这样做,我无法修改我的布局。我本以为我可以让我的布局成为双亲的孩子,但不行。像app=layout(master=root,c)这样的东西使用了
小部件。place
,而不是
小部件。grid
谢谢你的回复,我试过了,但仍然不起作用。我认为问题与几何体本身无关,更多的是父子关系。你是否尝试过将布局(master=root)更改为布局(master=C)?是的,但它不起作用,因为如果我这样做,我将无法修改我的布局。我想我可以让我的布局成为双亲的孩子,但是没有。像app=Layout(master=root,c)这样的东西使用的是
widget.place
,而不是
widget.grid
,谢谢你的回复,我试过了,仍然不起作用。我认为问题与几何体本身无关,更多的是父子关系。master=C给了我一个错误,因为我无法编辑窗口的几何体。这给了我一段艰难的时间,我决定使用PyQt5。非常感谢您的时间和努力!非常感谢您的帮助。@duvanmendoza:tk在这方面对您没有任何限制。我的回答中没有任何内容阻止您编辑窗口的几何图形。如果你有问题,也许你应该扩展你的问题,包括更多的细节,因为我在回答中给出的代码与你给出的代码非常吻合。是的,我终于意识到如何修改窗口的几何结构。我运行它,但从按钮到窗口顶部有一个空列。然后我继续在我的按钮之前创建画布,我仍然得到第一个结果。我更新了OP,这样你就可以看到我是怎么做的。哦,我刚刚意识到我用的是填充物。非常感谢你!master=C给了我一个错误,因为我无法编辑窗口的几何图形。这给了我一段艰难的时间,我决定使用PyQt5。非常感谢您的时间和努力!非常感谢您的帮助。@duvanmendoza:tk在这方面对您没有任何限制。我的回答中没有任何内容阻止您编辑窗口的几何图形。如果你有问题,也许你应该扩展你的问题,包括更多的细节,因为我在回答中给出的代码与你给出的代码非常吻合。是的,我终于意识到如何修改窗口的几何结构。我运行它,但从按钮到窗口顶部有一个空列。然后我继续在我的按钮之前创建画布,我仍然得到第一个结果。我更新了OP,这样你就可以看到我是怎么做的。哦,我刚刚意识到我用的是填充物。非常感谢你!