Tkinter Canvas矩形的disabledwidth参数为何无法生效?
问题:Tkinter Canvas矩形disabled状态下disabledwidth参数不生效
我希望Canvas中的矩形处于disabled状态时,其轮廓宽度能变大,因此设置了disabledwidth=4参数。但切换至disabled状态后,轮廓宽度仍为1而非4。而当鼠标移至矩形上切换为active状态时,activewidth=4能正常生效,轮廓宽度变为4。
复现代码:
import tkinter as tk def disabled(): canvas.itemconfig(rect, state="disabled") def normal(): canvas.itemconfig(rect, state="normal") root = tk.Tk() canvas = tk.Canvas(root, height=250, width=250) button1 = tk.Button(root, text="change rectangle to state disabled", command=disabled) button2 = tk.Button(root, text="change rectangle to state normal" , command=normal ) rect = canvas.create_rectangle(40, 40, 180, 180, fill = "red", activefill = "green2", activeoutline = "green3", activewidth = 4, disabledfill = "grey", disabledoutline= "grey2", disabledwidth = 4 ) canvas.grid() button1.grid() button2.grid() root.mainloop()
解决方案
Tkinter的Canvas组件中,disabledwidth是未被官方实现的参数,即使设置了也不会生效——Canvas仅支持width(默认宽度)和activewidth(鼠标悬停时的宽度)这两个与轮廓宽度相关的状态参数。
要实现disabled状态下轮廓变宽的效果,需要在切换状态时手动修改width参数:
修改后的代码
import tkinter as tk # 存储矩形初始轮廓宽度 INITIAL_WIDTH = 1 def set_disabled(): # 切换为disabled状态时,同时设置轮廓宽度为4 canvas.itemconfig(rect, state="disabled", width=4) def set_normal(): # 切回normal状态时,恢复初始轮廓宽度 canvas.itemconfig(rect, state="normal", width=INITIAL_WIDTH) root = tk.Tk() canvas = tk.Canvas(root, height=250, width=250) button1 = tk.Button(root, text="切换矩形为disabled状态", command=set_disabled) button2 = tk.Button(root, text="切换矩形为normal状态", command=set_normal) rect = canvas.create_rectangle(40, 40, 180, 180, fill="red", activefill="green2", activeoutline="green3", activewidth=4, disabledfill="grey", disabledoutline="grey2", width=INITIAL_WIDTH # 显式设置初始宽度 ) canvas.grid() button1.grid() button2.grid() root.mainloop()
说明
- 切换至disabled状态时,手动将
width设为4,实现轮廓变宽的效果;切回normal状态时,恢复初始宽度。 activewidth依然正常工作:鼠标悬停在矩形上时,会自动覆盖当前的width值为4,移开后恢复对应状态的宽度(disabled时为4,normal时为1)。
内容的提问来源于stack exchange,提问作者Matthias Schweikart
相关产品推荐
相关产品推荐

