我想PanedWindow小部件的子類可以按比例收縮/展開窗格。不過,我似乎無法將窗框放置到比窗口小部件要求大的座標上。演示:Tkinter PanedWindow.sash_place()失敗
from tkinter import *
class VerticalPropPanedWindow(PanedWindow):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, orient="vertical",
**kwargs)
self._default_weights, self._saved_weights = [], []
self.bind("<Button-3>", self.reset)
self.bind("<ButtonRelease-1>", self.save_weights)
self.bind("<Configure>", self.changed)
def add(self, child, weight, **options):
self._default_weights.append(weight)
self._saved_weights.append(weight)
super().add(child, **options)
def align(self):
wsize = self.winfo_height()
print("height: {}, reqheight: {}".format(wsize,
self.winfo_reqheight()))
sumw, coords = sum(self._saved_weights), []
for w in self._saved_weights[:-1]:
coords.append(sum(coords[-1:]) + int(wsize * w/sumw))
print("aligning to: ", coords)
for i, c in enumerate(coords):
self.sash_place(i, 1, c)
print("after align: ", [self.sash_coord(i)[1]
for i in range(len(self.panes()) - 1)])
def changed(self, event):
self.align()
def reset(self, event):
self._saved_weights = self._default_weights
self.align()
def save_weights(self, event):
n = len(self.panes()) - 1
wsize, coords = self.winfo_height(), []
for i in range(n):
coords.append(self.sash_coord(i)[1] - sum(coords))
self._saved_weights = coords + [wsize - sum(coords)]
if __name__ == "__main__":
root = Tk()
root.p = VerticalPropPanedWindow(root, bg="black")
root.p.add(Label(root.p, text="1/5"), 1, sticky="nesw")
root.p.add(Label(root.p, text="3/5"), 3, sticky="nesw")
root.p.add(Label(root.p, text="1/5"), 1, sticky="nesw")
root.p.pack(expand=1, fill='both')
root.mainloop()
嘗試調整窗口大小來體驗奇怪的行爲。通過檢查控制檯上的打印,您可以看到如果reqheight不夠好,第二個座標上的對齊失敗。
但是,通過手動拖動窗格abit然後右鍵單擊它(重置原始分佈)的作品。
我看到了兩個解決方案,在這裏:
- 要強制部件reqsize實際大小,而是如何?
- 要找到一些hacky的方式來首先拖動窗格,因爲它將由用戶完成。怎麼樣?
乾杯, 亞當
注:只有兩個窗格效果很好。
編輯:對齊():SUM(COORDS) - >總和(COORDS [-1:])
對於「按比例縮小/擴大窗格」的含義,你能更具體一點嗎?你想要什麼與它已經做的不同?如果我縮小第一個窗格,是不是想讓第二個和第三個窗格的等量增長? –
當我調整窗口大小時,窗格應該很好地保持1-3-1的比例。當我手動拖動一個應該定義一個新的發行版的窗格時,這個發行版將被保存並保存在隨後的調整大小。 – SzieberthAdam