让PanedWindow分隔符“捕捉”到特定位置,而不仅仅允许用户选择任意位置

2022-07-06 12:11:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()

有没有办法指定分隔符可以捕捉到的比例

允许的职位:

调整大小时,按钮应捕捉到这些位置中最近的位置


Tags: 用户importmessagefortkinterroot按钮tk比例ttkpw分隔符办法buttonspanedwindow
1条回答
网友
1楼 ·

可以通过将<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()