如何在Tkinter中获取可滚动画布上的坐标?
随着图形用户界面(GUI)应用程序的普及,Tkinter成为许多Python程序员的首选GUI库。Tkinter的一个常见问题是,如何获取在滚动可见区域内的子组件上的鼠标坐标。在本文中,我们将解释如何在Tkinter中获取可滚动画布上的坐标。
Tkinter canvas组件
在Tkinter中,有一个称为canvas的组件,可以在其中绘制形状、文本和其他内容。它还允许您在其中添加子控件(文本框、按钮等)。TKinter的canvas组件是一个非常强大而灵活的组件,但有时您可能需要更多的功能,例如当您有一个大的画布时,您想让用户滚动以查看它的部分。
要创建可滚动画布,请在Tkinter中使用Scrollbar和Canvas组件。
import tkinter as tk
root = tk.Tk()
root.geometry("300x300")
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side="right", fill="y")
canvas = tk.Canvas(root, yscrollcommand=scrollbar.set)
canvas.pack(side="left", fill="both", expand=True)
scrollbar.config(command=canvas.yview)
for i in range(100):
canvas.create_text(100, i * 10, text=f"Text {i}")
root.mainloop()
在上面的代码中,我们创建一个具有Scrollbar和Canvas组件的窗口。我们让Canvas组件占据窗口的左侧,并使用fill=”both”和expand=True使其充满整个窗口。然后我们添加了100个文本对象到Canvas组件中。ScrollBar组件放置在右边侧,允许用户滚动Canvas组件以查看文本对象。在此代码中,我们只使用了垂直滚动条,但是可以添加水平滚动条,具体请参考Tkinter文档。
获取可滚动画布上的坐标
它通常会变得有些棘手,因为画布拥有自己的坐标系,而您可能希望将坐标转换为子内部子控件中的坐标。
在下面的代码中,我们将通过获取鼠标扫过的画布上的坐标来演示如何在可滚动画布上获取坐标。我们将在Canvas组件上同时创建三个文本框,并添加可选菜单中的项目。当单击其中一个菜单项时,我们将在选定的文本框中显示鼠标单击的画布坐标。我们将使用canvasx和canvasy来转换全局标准坐标为画布内部坐标。
import tkinter as tk
root = tk.Tk()
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side="right", fill="y")
canvas = tk.Canvas(root, yscrollcommand=scrollbar.set)
canvas.pack(side="left", fill="both", expand=True)
scrollbar.config(command=canvas.yview)
for i in range(3):
text = tk.Text(canvas, height=i+1, width=25)
canvas.create_window(10, i*70+30, anchor="nw", window=text)
for j in range(i+1):
text.insert("end", f"\nOption {j+1}")
def onclick(e, text_box):
x = canvas.canvasx(e.x)
y = canvas.canvasy(e.y)
text_box.delete("1.0", "end")
text_box.insert("end", f"({x},{y})")
menu = tk.Menu(text, tearoff=0)
menu.add_command(label="Get Coords", command=lambda arg1=text: onclick(arg1))
text.bind("<Button-3>", lambda e, arg1=menu: arg1.post(e.x_root, e.y_root))
root.mainloop()
结论
通过以上步骤,我们可以求助于canvasx和canvasy方法在Tkinter画布中获取可滚动画布上的坐标。这种方法是实现带有滚动条的画布应用程序的一种常见方法。通过掌握如何使用canvas组件和scrollbar组件,以及如何使用canvasx和canvasy方法转换坐标,您可以开始构建具有可滚动子对象的复杂GUI应用程序。