Tkinter:如何在 Canvas 中设置文本小部件的相对宽度?

Tkinter: How to set relwidth of a Text widget in a Canvas?

在 Tkinter 中,当您在主 window 中放置一个文本小部件时,您可以设置文本小部件的宽度与主 window 的宽度之间的关系:

text.place(x = 10, y = 10, relwidth = 0.5)

如果文本小部件的父 window 是 Canvas 小部件,是否可以执行相同的操作?我尝试使用 Canvas itemconfig() 方法,但它不起作用:

text = Text(canvas)
canvas.create_window(10, 10, anchor = NW, window = text)
canvas.itemconfig(text, relwidth = 0.5)

在此先感谢您的帮助。

不,明确设置相对宽度仅在使用 place 时可用。如果您在 canvas 上创建对象,则由您自行计算以配置对象的宽度。

通过绑定到 canvas 的 <Configure> 事件来重新计算文本小部件的宽度相当简单,因为只要 canvas 改变大小(以及其他原因)。

这是一个将文本小部件放置在 canvas 上并将其宽度保持为 canvas 宽度一半的示例。 运行 代码,请注意,当您调整 window 大小时,文本小部件保持在 canvas 宽度的 50%。

import tkinter as tk

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.canvas = tk.Canvas(self.root, background="bisque")
        self.canvas.pack(fill="both", expand=True)

        self.text = tk.Text(self.canvas)
        print("feh:", str(self.text))
        self.canvas.create_window(10, 10, anchor="nw", window=self.text, tags=("text",))

        self.canvas.bind("<Configure>", self._canvas_resize)

    def _canvas_resize(self, event):
        relwidth = event.width / 2
        self.canvas.itemconfigure("text", width=relwidth)

e = Example()
tk.mainloop()