如何在R与Tcl/Tk中调整窗口大小时获取非顶级Frame几何尺寸
解决非顶级Tk Frame尺寸获取问题
tkwm.geometry()仅支持顶级窗口(比如tktoplevel创建的窗口实例),非顶级组件(如Frame这类容器)需要用winfo系列命令来获取尺寸信息,对应R的tcltk包就是tkwinfo()函数。
正确获取非顶级Frame尺寸的方法
- 获取组件宽度:
tkwinfo("width", 组件对象) - 获取组件高度:
tkwinfo("height", 组件对象) - 获取完整几何信息(格式为
宽x高+X偏移+Y偏移):tkwinfo("geometry", 组件对象)
修改后的完整代码
require(tcltk) || stop("tcltk support is absent") # Main Window base <- tktoplevel(padx=20, pady=20) # Change title using tk window manager tkwm.title(base,'Test App') # Main Window Frame main_frame <- tkframe(base) tools_frame <- tkframe(main_frame) label <- "Tools Frame" lab_tools <- tklabel(tools_frame,text=label,width=80) tkpack(tools_frame,lab_tools) body_frame <- tkframe(main_frame) bd_left_frame <- tkframe(body_frame, padx=5, pady=5) bd_left_label <- tklabel(bd_left_frame, text='Left Body Frame') tkpack(bd_left_frame, bd_left_label) tkpack(body_frame, bd_left_frame, side='left', anchor='n', expand=1, fill='both') bd_right_frame <- tkframe(body_frame, padx=5, pady=5) bd_right_frame_a <- tkframe(bd_right_frame) bd_right_label_a <- tklabel(bd_right_frame_a, text='Right Frame A') tkpack(bd_right_frame_a, bd_right_label_a) tkpack(bd_right_frame, bd_right_frame_a) bd_right_frame_b <- tkframe(bd_right_frame) bd_right_label_b <- tklabel(bd_right_frame_b, text='Right Frame B') tkpack(bd_right_frame_b, bd_right_label_b) tkpack(bd_right_frame, bd_right_frame_b) tkpack(body_frame, bd_right_frame, side='right', anchor='n', expand=1, fill='both') tkpack(main_frame, tools_frame) tkpack(main_frame, body_frame) # CALLBACKS onResize <- function() { # 获取宽高 width <- tkwinfo("width", bd_right_frame_b) height <- tkwinfo("height", bd_right_frame_b) # 或者获取完整几何信息 geo <- tkwinfo("geometry", bd_right_frame_b) cat("Frame尺寸:宽", width, ",高", height, "\n") cat("完整几何信息:", geo, "\n") } # Window Event Binds tkbind(base, '<Configure>', onResize) tkwait.window(main_frame)
额外说明
当窗口调整大小时,<Configure>事件会触发回调,此时通过tkwinfo()获取的Frame尺寸是实时更新的,可以直接用于后续图像缩放逻辑。
内容的提问来源于stack exchange,提问作者Matheus Fernando
相关产品推荐
相关产品推荐

