【发布时间】:2014-02-10 17:03:46
【问题描述】:
我想继承 PanedWindow 小部件,使其可以按比例缩小/扩展其窗格。但是,似乎我无法将窗扇放置在大于小部件 reqsize 的坐标上。演示:
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 不够大,第二个坐标上的对齐是如何失败的。
但是,通过手动拖动一个窗格并在此后右键单击它(这会重置原始分布)可以工作。
我在这里看到了两种解决方案:
- 强制小部件 reqsize 为实际大小,但如何?
- 首先要找到一些hacky 方法来拖动窗格,因为它会由用户完成。怎么样?
干杯, 阿达姆
注意:它只适用于两个窗格。
编辑:在 align(): sum(coords) -> sum(coords[-1:])
【问题讨论】:
-
您能否更具体地说明“按比例缩小/扩展其窗格”的含义?你想要的和它已经做的有什么不同?如果我缩小第一个窗格,您是否希望第二个和第三个窗格都增长相同的数量?
-
当我调整窗口大小时,窗格应该很好地保持它们的 1-3-1 比例。当我手动拖动一个窗格时,该窗格应定义一个新分布,该分布通过后续调整大小保存和保留。
标签: python python-3.x widget tkinter