使画布大小为其内容的大小

问题描述 投票:0回答:1

我正在尝试使用 Tkinter 构建用户界面。 在这样做时,我使用画布作为容器(因为画布是可滚动的,而框架则不是)。 然而我注意到画布的大小与框架不同。 框架会根据其内容的大小调整其大小 - 画布不会(据我所知)。

我真的希望画布“缩小到”/成为其内容的大小。有没有一种简单的方法可以做到这一点? (也许我错过了文档中的某些内容,而画布能够做到这一点,您可以向我指出这一点,或者之前已经问过这个问题(但是我自己没有找到这样的问题),您可以向我指出答案或者您可以提供有关如何自己创建此效果的建议)

举个例子: 这里的画布比放置在画布上的小部件更大。 (我将画布涂成黑色以使其更明显)。如何使画布的大小与画布上项目的大小相同(本例中为button1)。

from tkinter import Tk, Canvas, Button



window = Tk()



my_canvas = Canvas(window, highlightthickness=0, borderwidth=0)
my_canvas.grid(column=1, row=1)
my_canvas.config(background="black")

button1 = Button(my_canvas, text="testest", width=10, height=10)
window_id = my_canvas.create_window((0, 0), window=button1, anchor="nw")


window.mainloop()

我想出的一个可能的解决方案:

from tkinter import Tk, Canvas, Button



window = Tk()



my_canvas = Canvas(window, highlightthickness=0, borderwidth=0)
my_canvas.grid(column=1, row=1)
my_canvas.config(background="black")

button1 = Button(my_canvas, text="testest", width=10, height=10)
window_id = my_canvas.create_window((0, 0), window=button1, anchor="nw")

window.update()
my_canvas.configure(width=button1.winfo_width(), height=button1.winfo_height())


window.mainloop()

然而,这会在切换到新的调整尺寸之前瞬间显示画布的不期望/旧尺寸。感觉不对。有一个更好的方法吗? 如有任何帮助,我们将不胜感激。

PS:当然我可以添加

window.update()
print(button1.winfo_width())
print(button1.winfo_height())

我的代码并运行它以获取按钮的像素宽度和高度并调整我的代码,以便使用这些值初始化画布,但我希望它能够工作,即使我放置在画布上的小部件的大小是不是预先确定的(例如,当其他小部件放入其中时,框架可能会增长)。

python python-3.x tkinter tkinter-canvas
1个回答
0
投票

您可以使用

bbox
方法获取画布内容的边界框,然后使用该信息来计算和重新配置画布。

bbox
方法以(x1,y1,x2,y2)形式返回数据,使得所有命名元素的绘制区域都在由x1界定的区域内左侧,x2 右侧,y1 顶部,y2 底部。

注意:根据规范文档,“返回值可能会高估实际边界框几个像素。”

x1,y1,x2,y2 = my_canvas.bbox("all")
width = x2-x1
height=y2-y1
my_canvas.configure(width=width, height=height)
© www.soinside.com 2019 - 2024. All rights reserved.