You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动