是否可以将 create_window() 框架拉伸到父级(或根级)的大小?

is it possible to stretch create_window() frame to size of parent (or root)?

我想让我的聊天室应用程序图形用户界面可以调整大小。

我有一个 canvas,上面有一个 msg_frame,所有消息都将放入其中。

canvas 设置在根 place() 上,因此它保持相对于根 window 大小。 我也想让 msg_frame 相对于 canvas(或根)调整大小。

所以当我调整根 window 的大小时,消息不会像这样显示(蓝色是 msg_frame):

但坚持在右侧(靠近滚动条)。

这是我的代码(为了便于阅读删除了样式):

root = tk.Tk()
root.title("Chatroom")
root.geometry("1200x800")

chat_canvas = tk.Canvas(root, height=580, width=1160)
msg_frame = tk.Frame(chat_canvas, bg="blue", height=550, width=1160)

# scrollbar
canvas_sb = tk.Scrollbar(top_frame, orient='vertical', command=chat_canvas.yview)
chat_canvas.configure(yscrollcommand=canvas_sb.set)

# placing the scrollbar and canvas
chat_canvas.place(relwidth=0.98, relheight=1)
canvas_sb.place(relx=0.985, relheight=1)

create msg_frame window on canvas
chat_canvas.create_window((0, 0), window=msg_frame, anchor='nw', width=chat_canvas.winfo_reqwidth())

# resize canvas to fit to frame and update its scrollregion
def on_msg_frame_configure(event):
    # set canvas size as new 'stretched' frame size
    chat_canvas.configure(height=msg_frame.winfo_reqheight())
    chat_canvas.configure(scrollregion=chat_canvas.bbox('all'))

# my (not working) attempt to resize the blue msg_frame 
def on_top_frame_configure(event):
    msg_frame.configure(width=top_frame.winfo_reqwidth(), height=top_frame.winfo_reqheight())


# binds to resize widgets when root size changes
msg_frame.bind(sequence='<Configure>', func=on_msg_frame_configure)
top_frame.bind(sequence='<Configure>', func=on_top_frame_configure) # <-- not working

经过多次尝试,我终于得到了我想要的东西。这就是我所做的:

创建 window 时,为其分配一个变量

canvas_frame = chat_canvas.create_window((0, 0), window=msg_frame, anchor='nw', tags="msg_frame")

然后使用以下配置函数绑定小部件:


def on_chat_canvas_configure(event):
    # set canvas size as new 'stretched' frame size
    chat_canvas.itemconfig(canvas_frame, width=event.width)
    canvas_scrollbar.pack_configure(side='right', fill='y')
    chat_canvas.pack_configure(side='right', fill='both', expand=True)


def on_msg_frame_configure(event):
    print('on msg frame')
    chat_canvas.configure(scrollregion=chat_canvas.bbox('msg_frame'))

# binds
chat_canvas.bind('<Configure>', lambda e: on_chat_canvas_configure(e))
msg_frame.bind('<Configure>', lambda e: on_msg_frame_configure(e))

当根 window 的大小发生变化时,canvas' 的大小也会发生变化,并且触发配置事件,调用 on_chat_canvas_configure() 函数来更改 [=13= 的宽度] 在 canvas 上,同时保持滚动条和 canvas' 相对于根 window.

的大小

msg_frame 的大小发生变化时,此小部件的配置事件将触发并调用 on msg_frame_configure() 函数,该函数仅更新 canvas 的 scrollregion

希望我正确清楚地解释了逻辑。