是否可以将 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
。
希望我正确清楚地解释了逻辑。
我想让我的聊天室应用程序图形用户界面可以调整大小。
我有一个 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
。
希望我正确清楚地解释了逻辑。