鱼C论坛

 找回密码
 立即注册
查看: 1622|回复: 6

[已解决]求助,利用python中的tkinter,如何在画布中创建一个可以被选中的图案?

[复制链接]
发表于 2021-6-25 11:39:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好。

我现在想在画布(Canvas)上创建一个图案
(不一定是Canvas,别的也可以)

我的要求是这个图案能被选中,针对这个选中的图案,可以弹出右键menu等等
可以针对选中的图案,做进一步的操作

但是我用Canvas的话,只能画出图案,没有办法选中。

不知道大家有没有什么好的建议?

谢谢大家了


我现在简单的代码如下:

  1. #!/usr/bin/python3

  2. import tkinter as tk

  3. from tkinter import ttk

  4. root = tk.Tk()

  5. cv = tk.Canvas(root)

  6. cv.create_rectangle(10,10,110,110)

  7. cv.create_text(60,60, text='block 1')

  8. cv.pack()

  9. root.mainloop()
复制代码
最佳答案
2021-6-26 02:53:50
你这问题竟然让我折腾一晚上,Canvas和Menu都没用过,查了N多个网页,才搞定。。

  1. from tkinter import *
  2. from tkinter import ttk
  3. from tkinter import messagebox
  4. import random

  5. root = Tk()
  6. root.geometry("500x300")

  7. cv = Canvas(root, bg='white')
  8. cv.pack()
  9. cv.create_text(280, 200, text="左键单击矩形 \n或右键选择 可随机改变颜色")

  10. def oval_act(ev):
  11.     messagebox.showinfo(root, "你点击了矩形!")

  12. def rect_act():
  13.     colors = ['red', 'blue', 'green', 'black', 'white', 'grey']
  14.     cv.itemconfig("my_rect", fill=random.choice(colors))

  15. def right_click(ev):
  16.     try:
  17.         m.tk_popup(ev.x_root, ev.y_root)
  18.     finally:
  19.         m.grab_release()

  20. # 右键菜单内容(模拟)
  21. m = Menu(root, tearoff = 0)
  22. m.add_command(label = "随机改变颜色", command=rect_act)
  23. m.add_command(label ="Cut")
  24. m.add_command(label ="Copy")
  25. m.add_separator()
  26. m.add_command(label ="Rename")

  27. oval = cv.create_oval(100, 100, 200, 180, fill='yellow') # 要带fill=..参数,点击动作才行!!
  28. cv.tag_bind(oval, '<Button-1>', oval_act)

  29. cv.create_rectangle(200, 100, 300, 150, fill='blue', tags="my_rect")
  30. cv.tag_bind("my_rect", "<Button-1>", lambda ev: rect_act())  # 左键单击改变颜色(注意这里的写法,否则传参报错!)
  31. cv.tag_bind("my_rect", "<Button-3>", right_click)  # 右键弹出菜单

  32. root.mainloop()


  33. # 参考:
  34. # 官方文档 https://tkdocs.com/tutorial/canvas.html
  35. # https://pythonguides.com/python-tkinter-canvas/ 基本例子
  36. # http://sandbox.mc.edu/~bennet/python/code/canv_py.html 好例子!(模块需部分修改)
  37. ……
  38. 。。? 不能放链接?什么不良信息?。。
复制代码


其他,看你自己了,我歇了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-25 11:52:14 | 显示全部楼层
不会,下一位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 11:54:17 From FishC Mobile | 显示全部楼层
画布图案能不能被选中要你自己实现,根据鼠标是否移动进入图案范围、是否点击等实现鼠标进入/离开事件、鼠标点击事件等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-25 12:46:27 | 显示全部楼层
hrpzcf 发表于 2021-6-25 11:54
画布图案能不能被选中要你自己实现,根据鼠标是否移动进入图案范围、是否点击等实现鼠标进入/离开事件、鼠 ...

谢谢,这个也是一个思路

不知道其他办法(不用画布),能不能实现这种功能?

在屏幕上显示一些东西,然后可以选中什么的

再次感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 17:52:02 From FishC Mobile | 显示全部楼层
python初学者021 发表于 2021-6-25 12:46
谢谢,这个也是一个思路

不知道其他办法(不用画布),能不能实现这种功能?

在按钮上显示图案是否可行?我不熟悉tk,不是很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-25 22:06:05 | 显示全部楼层
不建议用画布,建议用 Label
  1. #!/usr/bin/python3

  2. import tkinter as tk

  3. from tkinter import ttk

  4. root = tk.Tk()

  5. cv = tk.Canvas(root)

  6. cv.create_rectangle(10,10,110,110)

  7. cv.create_text(60,60, text='block 1')

  8. cv.pack()


  9. menu = tk.Menu(root,tearoff=0)
  10. menu.add_command(label="选项一", command=None)
  11. menu.add_command(label="选项二", command=None)
  12. menu.add_separator()
  13. menu.add_command(label="选项三", command=None)
  14. def popupmenu(event):
  15.       menu.post(event.x_root,event.y_root)
  16.       
  17. cv.bind("<Button-3>",popupmenu)
  18. root.mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 02:53:50 | 显示全部楼层    本楼为最佳答案   
你这问题竟然让我折腾一晚上,Canvas和Menu都没用过,查了N多个网页,才搞定。。

  1. from tkinter import *
  2. from tkinter import ttk
  3. from tkinter import messagebox
  4. import random

  5. root = Tk()
  6. root.geometry("500x300")

  7. cv = Canvas(root, bg='white')
  8. cv.pack()
  9. cv.create_text(280, 200, text="左键单击矩形 \n或右键选择 可随机改变颜色")

  10. def oval_act(ev):
  11.     messagebox.showinfo(root, "你点击了矩形!")

  12. def rect_act():
  13.     colors = ['red', 'blue', 'green', 'black', 'white', 'grey']
  14.     cv.itemconfig("my_rect", fill=random.choice(colors))

  15. def right_click(ev):
  16.     try:
  17.         m.tk_popup(ev.x_root, ev.y_root)
  18.     finally:
  19.         m.grab_release()

  20. # 右键菜单内容(模拟)
  21. m = Menu(root, tearoff = 0)
  22. m.add_command(label = "随机改变颜色", command=rect_act)
  23. m.add_command(label ="Cut")
  24. m.add_command(label ="Copy")
  25. m.add_separator()
  26. m.add_command(label ="Rename")

  27. oval = cv.create_oval(100, 100, 200, 180, fill='yellow') # 要带fill=..参数,点击动作才行!!
  28. cv.tag_bind(oval, '<Button-1>', oval_act)

  29. cv.create_rectangle(200, 100, 300, 150, fill='blue', tags="my_rect")
  30. cv.tag_bind("my_rect", "<Button-1>", lambda ev: rect_act())  # 左键单击改变颜色(注意这里的写法,否则传参报错!)
  31. cv.tag_bind("my_rect", "<Button-3>", right_click)  # 右键弹出菜单

  32. root.mainloop()


  33. # 参考:
  34. # 官方文档 https://tkdocs.com/tutorial/canvas.html
  35. # https://pythonguides.com/python-tkinter-canvas/ 基本例子
  36. # http://sandbox.mc.edu/~bennet/python/code/canv_py.html 好例子!(模块需部分修改)
  37. ……
  38. 。。? 不能放链接?什么不良信息?。。
复制代码


其他,看你自己了,我歇了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表