Problema com o posicionamento do caixilho do PanedWindow em uma aba do Notebook.
Estou tentando criar uma aba do Notebook que contém uma PanedWindow com quatro painéis.
Entretanto, quando tento posicionar as folhas manualmente, a terceira folha não aparece na posição esperada.
Comportamento esperado:
As três faixas devem ser colocadas nas posições 100, 657 e 1000.
Comportamento observado:
- As duas primeiras faixas estão colocadas corretamente em 100 e 657.
- A terceira faixa aparece em 663 em vez de 1000.
Aqui está meu código:
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()
Mesmo após a janela ser criada, ao clicar no botão, o caixilho não será posicionado corretamente.
Informações do sistema:
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
Qualquer informação sobre o motivo pelo qual a terceira faixa não está posicionada corretamente seria muito apreciada!
Quando executo seu código e fecho a janela imediatamente, obtenho o seguinte resultado no terminal:
Não é o mesmo que você disse na pergunta: 100, 657, 663. Observe que minha plataforma é Windows, não Linux.
Se eu imprimir as larguras solicitadas e reais do
frame
interiorTestFrame._master_frame()
:Eu entendo:
Então a largura da moldura é menor que 1000 quando você tenta colocar a terceira faixa em 1000. Pode ser a causa.
Você pode especificar a largura dessas caixas de listagem para que a largura total seja maior que 1000:
Então essas faixas podem ser colocadas nas posições especificadas.
Observe também que a seguinte linha interna
TestFrame.__init__()
não é necessária e pode ser removida: