Python3 tkinter Canvas ,设置相对宽度和高度

标签 python python-3.x tkinter tkinter-canvas

我正在尝试将某些 Canvas 的宽度设置为母版的宽度(全屏),并将高度设置为母版的 1/5、3/10 和 1/2。窗口已正确显示,但 Canvas 未出现。我尝试使用 place() 而不是 pack() 并使用 relwidth = 1 和 relheight = 0.2 失败。 我只想将我的三个 Canvas 堆叠起来并水平填充窗口。

master = Tk()
master.attributes('-zoomed', True)

w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5

c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()

编辑:我的工作代码现在是:

c1 = Canvas(master)
c1.place(rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master)
c2.place(rely = 0.2, relheight = 0.3, relwidth = 1)
c3 = Canvas(master)
c3.place(rely = 0.5, relheight = 0.5, relwidth = 1)

但我有一个副作用,我无法在中心对齐文本:

c1.create_text(0, 0, text = 'text', fill = 'red', font = ('olivier', 30, 'bold'))
c1.update()

我以这种不优雅的方式解决了这个问题:

master.update_idletasks()
w = master.winfo_width()
h = master.winfo_height()
ww = int(w/2)
hh = int(h/10)
c1.create_text(ww, hh, text = 'text', fill = 'red')

最佳答案

您需要使用.place()几何管理器。

.place() 有两个我认为您需要的主要参数。

第一个是relheight。顾名思义,它设置任何小部件相对于其父小部件的高度。

因此,如果 relheight 为 0.5,则高度将为 0.5(高度),即父窗口小部件高度的 50%。

这同样适用于 relwidth,其工作方式相同,但适用于宽度。

了解有关 .place() 的更多信息 here

此外,如果您想要代码:

master = Tk()
master.attributes('-zoomed', True)

c1 = Canvas(master, bg='grey')
c1.place(x = 0, rely = 0, relheight = 0.2, relwidth = 1)
c2 = Canvas(master, bg='blue')
c2.pack(x = 0, rely = 0.25, relheight = 0.3, relwidth = 1)
c3 = Canvas(master, bg='red')
c3.pack(x = 0, rely = 0.5, relheight = 0.5, relwidth = 1)

希望这有帮助!

编辑:.place() 不适用于 Canvas 元素。为此,您需要获取 Canvas 的长度和宽度,然后将两者除以二(如果您想要中间)。

例如:

height = 100
width = 100
c = Canvas(master, bg = "blue", height = height, width = width, highlighthickness = 0)
c.place(x = 0, rely = 0.5, relheight = 0.2, relwidth = 1)
text = c.create_text(height/2, width/2, text = "text")

这会将文本 text 放置在 Canvas 的中心。

希望这有帮助!

关于Python3 tkinter Canvas ,设置相对宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61786908/

相关文章:

python - 显示许多 4x2 绘图

python-3.x - 如何向 tkinter.Listbox 添加列?

python - 当套接字循环发生时,Tkinter 无法工作

python - Tkinter:标签和按钮框架之间的空间太大

python - 无法将指标值推送到 InfluxDB

python - matplotlib 填充箱线图的边框颜色

python - 如何通过 python-active-directory 模块中的 setup.py 运行单个 nosetest?

python - 使用 Python TKinter/imageTK 在屏幕上的图像之间淡入淡出

python - 价格合适 'Showcase Showdown'

python - 任何人都可以看到我的代码中的缺陷吗?