python - 将 PanedWindow 分隔符 "snap"放置到某些位置,而不是只允许用户选择任何随机位置

标签 python python-3.x tkinter

我有一个包含一些小部件的 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()

有没有办法指定分隔符可以对齐的比例?

允许的位置:

调整大小时,按钮应吸附到最近的这些位置。

最佳答案

您可以通过绑定(bind) <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()

关于python - 将 PanedWindow 分隔符 "snap"放置到某些位置,而不是只允许用户选择任何随机位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69000928/

相关文章:

python - python 3 中缺少 argparse

python - 名称错误 : name 'random' is not defined

python - 将带有日期和时区的字符串解析为 UTC 日期时间

python - 调用 tkinter askopenfilename 方法后,打开文件对话框卡住

知道哪个按钮按下的 Python 函数 (Tkinter)

python - 使用 for 循环从列表中删除字典

python - python中更快的分数模块

python - Python 中的数据框转换

python-3.x - Python 3.6 urllib 为什么行以 b 开头

Python西蒙游戏: I Got Stuck Finishing the Sequence