【问题标题】:How can I bring a Canvas to front?如何将 Canvas 放在前面?
【发布时间】:2022-01-14 22:43:52
【问题描述】:

我重叠了 5 个 Tk.Canvas 对象,每个对象都有不同的图像。我想将每个画布放在所有其他画布的前面,以便在最前面的画布中绘制图片。

class window_tk():
def __init__(self,main):
    self.main=main
    self.canvas_org = tk.Canvas(self.main, bg='white')
    self.canvas_layer1 = tk.Canvas(self.main, bg='red')
    self.canvas_layer2 = tk.Canvas(self.main, bg='green')
    self.canvas_layer3 = tk.Canvas(self.main, bg='blue')
    self.canvas_layer4 = tk.Canvas(self.main, bg='black')
    self.btn_load = tk.Button(self.main,text = "Load Image",command = self.load_ct)
    self.btn_layer1 = tk.Button(self.main,text = "Draw in L1",command = self.bring_1)
    self.btn_layer2 = tk.Button(self.main,text = "Draw in L2",command = self.bring_2)
    self.btn_layer3 = tk.Button(self.main,text = "Draw in L3",command = self.bring_3)
    self.btn_layer4 = tk.Button(self.main,text = "Draw in L4",command = self.bring_4)

def bring_1(self):
    self.canvas_layer1.place(x=50,y=00)

def bring_2(self):
    self.canvas_layer2.place(x=50, y=00)

def bring_3(self):
    self.canvas_layer3.place(x=50, y=00)

def bring_4(self):
    self.canvas_layer4.place(x=50, y=00)

我认为 canvas.place() 函数会将画布放在前面,但事实并非如此。我可以使用哪个功能?还是我应该打开所有其他画布的包装?

【问题讨论】:

  • 由于Canvas已经覆盖了.tkraise()函数,所以需要直接调用TCL命令:self.canvas.tk.call('raise', self.canvas._w)
  • @acw1668 你是我的救星谢谢

标签: python tkinter canvas


【解决方案1】:

由于Canvas已经覆盖了.tkraise()函数,所以需要直接调用TCL命令:

self.canvas.tk.call('raise', self.canvas._w)

【讨论】:

  • 感谢您的洞察力,我修改了我的答案以参考您的答案。
【解决方案2】:

您可以使用以下功能-

canvas.tag_raise(canvas_layer4) -> For bringing to front

canvas.tag_lower(canvas_layer4) -> For pushing back

【讨论】:

  • 他有 5 个独立的 Canvas 对象相互叠加,而不是一个包含 5 个项目的 Canvas。
【解决方案3】:

请看acw1668给出的答案。 lift 函数不适用于 Canvas 对象。他的回答是正确的。

所有 tkinter 对象,包括 Canvas,都支持以下方法:

w.lift(aboveThis=None) 如果参数为 None,则包含 w 的窗口将移动到窗口堆叠顺序的顶部。要将窗口移动到某个顶层窗口 w 的上方,请将 w 作为参数传递。

这使您可以完全控制哪个小部件位于顶部。

https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/universal.html

现在我重新阅读,我发现它的语言有点不正确。 “w”是任何 tkinter 小部件,“above_this”是另一个 tkinter 小部件。该函数按堆叠顺序将“w”置于“above_this”之上。

【讨论】:

  • lift()tkraise() 已被 Canvas 覆盖以提升/提升画布项目,因此不适用于 Canvas 本身。
  • 我不相信你,但是记录在哪里?
  • 在 tkinter source code.
  • 我去看看。我看到 New Mexico Tech 文档说 Canvas.tag_raise 和 Canvas.tag_lower 不适用于 Canvas 窗口项目,但我认为这是指使用 Canvas.create_window 放置在 Canvas 中的项目。这就是我们所说的吗?
  • OP 想要提升 Canvas 对象本身,而不是其中的项目。
猜你喜欢
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2019-08-04
  • 2011-05-20
相关资源
最近更新 更多