python - 让 PanedWindow 分隔符“捕捉”到某些位置,而不是只允许用户选择任何随机位置
问题描述
我有一个包含一些小部件的 tkinter PanedWindow,我希望用户能够将每个分隔符拖到某个位置,当他们放开鼠标按钮时,分隔符应该“捕捉”到位置列表中最近的位置/我给程序的比例。例如,假设我有一个包含两个按钮的 PanedWindow,我希望用户能够调整按钮的大小,使它们的比例可以是 1/4:3/4、1/2:1/2 或 3 /4:1/4 不仅仅是用户选择的任何宽度。有没有办法我可以做到这一点?带有两个按钮的 PanedWindow 代码:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry("400x400")
pw = tk.PanedWindow(root)
buttons = [ttk.Button(text=message) for message in ["goose", "duck"]]
for button in buttons:
pw.add(button)
pw.pack(expand=True, fill="both")
root.mainloop()
有没有办法指定分隔符可以捕捉到的比例?
允许的职位:
调整大小时,按钮应捕捉到这些位置中最近的位置。
解决方案
您可以通过绑定<ButtonRelease-1>
到计算最近点的函数来做到这一点。然后,您可以使用此信息并使用 更新窗扇位置PanedWindow.sash_place(index, x, y)
。
这是一个最小的例子:
import tkinter as tk
from tkinter import ttk
def snap(event):
width = pw.winfo_width()
closest = min([width//2, width//4, width*3//4], key=lambda w: abs(w - event.x))
pw.sash_place(0, closest, 1)
root = tk.Tk()
root.title("snappy")
pw = tk.PanedWindow(root)
buttons = [ttk.Button(text=message) for message in ["goose", "duck"]]
for button in buttons:
pw.add(button)
pw.pack(expand=True, fill="both")
pw.bind("<ButtonRelease-1>", snap)
root.mainloop()
推荐阅读
- java - 将新列的字符串添加到 StringBuilder
- html - 如何将img放在div旁边?
- reactjs - 如何使用 React js 中的 Hooks 在网页上上传/浏览和显示图像?
- php - 执行功能不起作用它在窗口数组问题中出错
- java - 从 URL 获取 Json 中的多个 UUID
- c - 我无法连接 ATtiny85 和 EM18(RFID 阅读器)
- spring - 想按类型查找用户
- java - 在 Manjaro Linux 上运行 Java 程序
- python - 使用python在Excel中搜索字符串
- html - MediaQuery 不工作。对于桌面(超过 992 像素)全部保留在一行中,对于平板电脑,前 2 个应为 50% 宽度,第 3 个应为 100%,对于移动设备全部为 100%