ttk.PanedWindow拖拽时调用sashpos(ind, n)无法固定分隔条位置的问题求助
ttk.PanedWindow拖拽时调用sashpos(ind, n)无法固定分隔条位置的问题求助
看起来你遇到的问题是ttk.PanedWindow的默认拖拽逻辑会覆盖你在<B1-Motion>事件里设置的sashpos值,导致分隔条没法固定到指定位置。我来给你几个可行的解决方案:
阻止默认拖拽事件的后续处理
你当前的代码里,每次拖拽鼠标时确实调用了sashpos(0,120),但ttk.PanedWindow自己的拖拽处理逻辑会在你的绑定之后执行,重新根据鼠标位置调整分隔条。解决办法是在你的事件处理函数最后返回"break",告诉Tkinter不要再处理这个事件的后续绑定(包括PanedWindow自带的拖拽逻辑):def enforce_sash_limits(self, event): self.main_paned_win.sashpos(0, 120) return "break" # 阻止默认的拖拽行为生效确保设置的位置是合法的
如果你的两个Pane设置了最小宽度,或者整个PanedWindow的总宽度不够,ttk.PanedWindow会自动忽略不合法的sashpos设置。你可以给两个Pane添加minsize参数,确保120的位置是有效的:self.main_paned_win.add(self.slides_pane, weight=3, minsize=100) self.main_paned_win.add(self.preview_pane, weight=2, minsize=80)这样设置后,分隔条的位置不会因为Pane最小宽度限制而被强制调整。
备选方案:绑定ButtonRelease事件
如果你不需要在拖拽过程中实时固定,而是在松开鼠标后再回到指定位置,可以把绑定事件改成<ButtonRelease-1>,这样用户拖拽时可以自由移动,松开后自动复位:self.main_paned_win.bind("<ButtonRelease-1>", self.enforce_sash_limits)
另外,我注意到你用的是Fedora Workstation 41,这个系统下的ttk主题(比如Adwaita)可能对PanedWindow的交互逻辑有一些默认行为,但上面的方案应该能覆盖这些情况。你可以先试试第一个方案,返回"break"应该是最直接解决你当前问题的办法。
备注:内容来源于stack exchange,提问作者user28962430




