用tkinter 版本8.6 写一个 点击PhotoImage 显示弹窗,弹窗显示点击坐标,再点击PhotoImage,关闭弹窗并重新打开一个弹窗显示坐标
时间: 2023-05-29 15:02:11 浏览: 157
以下是一个实现上述功能的示例代码:
```python
import tkinter as tk
class PopupWindow(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
self.geometry("+%d+%d" % (parent.winfo_rootx() + parent.winfo_width(), parent.winfo_rooty()))
self.title("Popup Window")
self.label = tk.Label(self, text="Click on the image to see the coordinates")
self.label.pack(padx=10, pady=10)
def update_label(self, x, y):
self.label.config(text="Clicked at x={}, y={}".format(x, y))
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry("400x400")
self.title("Photo Image Popup")
self.popup_window = None
self.img = tk.PhotoImage(file="my_image.png")
self.canvas = tk.Canvas(self, width=400, height=400)
self.canvas.create_image(0, 0, image=self.img, anchor="nw")
self.canvas.pack()
self.canvas.bind("<Button-1>", self.show_popup)
def show_popup(self, event):
if self.popup_window is None:
self.popup_window = PopupWindow(self)
else:
self.popup_window.destroy()
self.popup_window = PopupWindow(self)
self.popup_window.update_label(event.x, event.y)
self.popup_window.grab_set()
if __name__ == '__main__':
app = App()
app.mainloop()
```
这个程序首先定义了一个 `PopupWindow` 类来实现弹窗功能。在类的构造函数中,调用 `super()` 函数来初始化 `Toplevel` 窗口,并在窗口中添加一个 `Label` 组件,用于显示点击坐标。该类还有一个 `update_label()` 方法,用于更新 `Label` 显示坐标信息。
接下来,在主程序中定义一个 `App` 类来创建主窗口,并在窗口中添加一个 `Canvas` 组件来显示图片。当用户单击 `Canvas` 时,在窗口中创建一个 `PopupWindow` 对象,并通过 `update_label()` 方法将点击坐标传递给弹窗。如果弹窗已经存在,则先销毁它并重新创建一个新的弹窗。
注意,为了确保弹窗始终位于主窗口的右侧,我们在弹窗的构造函数中使用主窗口的坐标和大小计算弹窗的位置。此外,在每次弹窗出现时,我们调用 `grab_set()` 函数来确保它成为当前焦点,从而防止用户操作主窗口。
阅读全文