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

Tkinter Notebook标签页中PanedWindow滑块(sash)定位异常求助

Tkinter Notebook标签页中PanedWindow滑块(sash)定位异常求助

大家好,我最近在用Tkinter做界面的时候碰到了一个奇怪的问题:我想在Notebook的标签页里放一个水平方向的PanedWindow,里面包含四个窗格,手动设置三个滑块的位置时,第三个滑块总是不在预期的位置上,折腾了好久都没解决,想请教下各位有没有思路?

预期行为

我希望三个滑块分别定位在100、657、1000的位置(水平方向)。

实际观察到的行为

  • 前两个滑块能正常定位到100和657的位置;
  • 第三个滑块却跑到了663的位置,完全不是我设置的1000。

下面是我写的测试代码:

import tkinter as tk
from tkinter import ttk


class Main():
    def __init__(self) -> None:
        self.root = tk.Tk()
        self.root.geometry('1100x400')
        self.root.protocol("WM_DELETE_WINDOW", self.dismiss)
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)

        notebook = self._notebook(self.root)
        notebook.grid(row=0, column=0, sticky=tk.NSEW)

        # Debugging button to retry sash placement
        button = tk.Button(self.root, text='...', command=self.click)
        button.grid(row=1, column=0)

        self.root.mainloop()

    def _notebook(self, master: tk.Frame) -> ttk.Notebook:
        notebook = ttk.Notebook(master)
        self.test_tab = TestFrame(notebook)
        notebook.add(self.test_tab.master_frame, text='Test')
        return notebook

    def dismiss(self, *args) -> None:
        print([self.test_tab.master_frame.sash_coord(index) for index in range(3)])
        self.root.destroy()

    def click(self, *args) -> None:
        # Attempt to reposition sashes (1 moves, 2 doesn't)
        sashes = [(100, 1), (500, 1), (1000, 1)]
        for index, sash in enumerate(sashes):
            self.test_tab.master_frame.sash_place(index, sash[0], 0)


class TestFrame():
    def __init__(self, master) -> None:
        self.master_frame = self._master_frame(master)
        self.master_frame.grid(row=0, column=0, sticky=tk.EW)

        # Expected sash positions
        sashes = [(100, 1), (657, 1), (1000, 1)]
        for index, sash in enumerate(sashes):
            self.master_frame.sash_place(index, sash[0], 0)

    def _master_frame(self, master) -> ttk.PanedWindow:
        frame = tk.PanedWindow(master, orient=tk.HORIZONTAL)

        for _ in range(4):
            listbox = tk.Listbox(frame)
            frame.add(listbox)

        return frame


if __name__ == '__main__':
    Main()

我试过在窗口创建完成后点击界面上的按钮重新设置滑块位置,但第三个滑块还是没法定位到1000的位置。

我的系统信息

OS: Manjaro Linux
KDE Plasma Version: 6.2.5
KDE Frameworks Version: 6.10.0
Qt Version: 6.8.2
Python Version: 3.13.1
tk.TkVersion: 8.6

真心希望各位能帮我分析下为什么第三个滑块会出现这种异常,谢谢大家!

备注:内容来源于stack exchange,提问作者Psionman

火山引擎 最新活动