如何正确检测ttk.Panedwindow的sash(窗格分隔条)移动?
检测ttk.Panedwindow窗格移动的正确方法
之前通过绑定<Configure>事件来检测窗格移动的方式并不精准,这个事件会在多种无关场景下触发(比如主窗口大小调整、组件布局更新等),并非专门针对窗格拖动的事件。
ttk.Panedwindow提供了专门的**<<Panedwindow>>虚拟事件**,该事件只会在拖动窗格(sash)调整分区大小的时候触发,这才是检测窗格移动的正确方法。
修改后的测试脚本
import tkinter as tk import tkinter.ttk as ttk class App(ttk.PanedWindow): def __init__(self, parent, orient="horizontal"): super().__init__(parent, orient=orient) self.parent = parent self.frame1 = ttk.Frame(self) self.frame2 = ttk.Frame(self) self.add(self.frame1) self.add(self.frame2) # 创建滚动条 self.xsb = ttk.Scrollbar(self.frame2, orient='horizontal') # 为frame2创建横向滚动条 self.ysb = ttk.Scrollbar(self.frame2, orient='vertical') # 为frame2创建纵向滚动条 self.xsb.pack(side=tk.BOTTOM, fill=tk.X ) # 横向滚动条置于底部,填充X轴 self.ysb.pack(side=tk.RIGHT, fill=tk.Y ) # 纵向滚动条置于右侧,填充Y轴 self.t5 = tk.Text(self.frame2, wrap='none', xscrollcommand=self.xsb.set, yscrollcommand=self.ysb.set) for line in range(50): self.t5.insert(tk.END, str(line+1) + " 现在是所有善良的人站出来帮助他们群体的时候。现在是所有善良的人站出来帮助他们群体的时候。\n") self.t5.pack(expand=True, fill='both') # 让文本组件填满frame2 # 绑定专门的窗格移动事件 self.bind("<<Panedwindow>>", self.on_sash_move) def on_sash_move(self, event): self.update_idletasks() # 获取两个窗格的当前大小 frame1_width = self.frame1.winfo_width() frame2_width = self.frame2.winfo_width() print(f"窗格1宽度: {frame1_width}, 窗格2宽度: {frame2_width}") if __name__ == "__main__": root = tk.Tk() root.title("测试") root.geometry('600x400+400+350') app = App(root) app.pack(fill=tk.BOTH, expand=True) root.mainloop()
说明
<<Panedwindow>>虚拟事件是ttk.Panedwindow的专属事件,仅在拖动窗格时触发,避免了<Configure>事件的误触发问题。- 在事件处理函数中,可以通过
winfo_width()/winfo_height()获取窗格的实时尺寸,实现更精准的业务逻辑。
内容的提问来源于stack exchange,提问作者Sun Bear
相关产品推荐
相关产品推荐

