You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter Canvas内嵌Frame自适应扩展触发itemconfig属性错误求助

错误原因

  • canvas_configure函数中错误对事件对象event调用了itemconfig方法,该方法是Canvas对象的专属方法,事件对象本身不具备该属性
  • itemconfig方法操作画布内元素时,需要传入create_window方法返回的元素ID,不能直接传入Frame对象
  • 未给内嵌Frame的列设置拉伸权重,就算Frame宽度适配了Canvas,内部的Entry控件也不会自动横向填充

修复后完整可运行代码

from tkinter import *

# Master frame
app = Tk()
app.columnconfigure(0, weight=1)
app.rowconfigure(0, weight=1)


def load_files():
    # Do stuff which gives list of company names
    companies_list = [x for x in range(0, 30)]

    # Generates Tkinter elements
    y = 0
    for x in companies_list:
        y += 1
        old_co = Entry(frame)
        old_co.insert(0, x)
        old_co.grid(row=y, column=0, sticky=E+W)

        new_co = Entry(frame)
        new_co.grid(row=y, column=1, sticky=E+W)

        prefix = Entry(frame)
        prefix.grid(row=y, column=2, sticky=E+W)


# Sub-Frame
company_header_frame = LabelFrame(app, text='Company Name')
company_header_frame.grid(row=0, column=0, sticky=N+S+E+W)
company_header_frame.columnconfigure(0, weight=1)
company_header_frame.rowconfigure(0, weight=1)

# Canvas
canvas = Canvas(company_header_frame, height=100)
canvas.grid(row=0, column=0, sticky=N+S+E+W)

# Canvas Frame
frame = Frame(canvas)
# 给Frame的三列设置拉伸权重,内部Entry可跟随填充
frame.columnconfigure(0, weight=1)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(2, weight=1)
# 保存create_window返回的元素ID,后续用于调整属性
frame_window = canvas.create_window((0, 0), window=frame, anchor='nw')

# Sidebar
scroll_y = Scrollbar(company_header_frame, orient="vertical")
scroll_y.grid(row=0, column=1, sticky=N+S)
scroll_y.config(command=canvas.yview)


def canvas_configure(event):
    canvas_width = event.width
    # 调用canvas对象的itemconfig方法,传入保存的窗口元素ID
    canvas.itemconfig(frame_window, width=canvas_width)


def config_frame(_):
    canvas.configure(scrollregion=canvas.bbox('all'), yscrollcommand=scroll_y.set)


canvas.bind('<Configure>', canvas_configure)
frame.bind('<Configure>', config_frame)


load_files()


app.mainloop()

主要修改点

  • 保存canvas.create_window的返回值作为元素操作ID
  • 修正canvas_configure函数的调用对象,改用全局canvas对象调用itemconfig
  • 给内嵌Frame的三列配置拉伸权重,实现内部Entry的自适应填充

内容的提问来源于stack exchange,提问作者WRL41225

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:57:04