我已經找到了針對此問題的多種建議解決方案,但是下面建議的函式的所有變體在應用于我的代碼時要么不起作用,要么導致錯誤。如前所述,我希望畫布框架中的元素向左和向右擴展,問題似乎出在canvas_configure()函式上。這是我正在使用的腳本的最小化版本:
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)
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
event.itemconfig(frame, 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()
這會導致以下錯誤:
AttributeError: 'Event' object has no attribute 'itemconfig'
我嘗試調整函式以.winfo_width()代替width,用實際畫布替換事件,但與寬度或 itemconfig 相關的類似屬性錯誤結果。任何建議將不勝感激。
uj5u.com熱心網友回復:
該錯誤準確地告訴您出了什么問題:Event物件沒有itemconfig方法。但是,畫布小部件可以,并且該Event物件可以為您提供畫布小部件:
def canvas_configure(event):
canvas_width = event.width
event.widget.itemconfig(frame, width=canvas_width)
# ^^^^^^^
與提出的具體問題無關,您還需要將有效的專案 ID 傳遞給itemconfig- 您不能傳遞框架本身。
您要么需要保存回傳的值,create_window要么需要給視窗一個標簽。
例如:
canvas.create_window(..., tags=("inner_frame",))
...
def canvas_configure(event):
canvas_width = event.width
event.widget.itemconfigure("inner_frame", width=canvas_width)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375698.html
