在做一个小项目,程序运行后可以用鼠标自由选择图像上的区域,生成数据到二进制文件,然后再由其它程序读取这个二进制文件生成一个网页文件,网页文件里的图像就会自动有热点链接了。当然,这个程序需要sprites模块支持,需要测试的同学请用pip install sprites安装好Python精灵模块后,再复制代码去测试研究。别忘了按照程序里说的准备好一张宽度886,高度660的叫a.png的图片。以下是测试版的代码:
"""
图像热点链接可视化编辑器.py
"""
import pickle
from sprites import *
def draw_rect(rectangle):
x1,y1,x2,y2 = rectangle
screen.cv.create_rectangle(x1,-y1,x2,-y2)
def savedata():
"""把miaolinks存入文件中"""
f = open('hot.dat',mode='wb')
pickle.dump(miaolinks,f)
f.close()
showinfo('提示','miaolinks数据存入hot.dat成功!')
screen_width,screen_height = 900,700
screen = Screen()
screen.setup(900,700)
screen.bgpic('a.png')
screen.addpopup()
# 以下代码修改索引为0的菜单项目
screen.popup. entryconfig(0, label='保存入hot.dat文件:',command=savedata)
imgwidth,imgheight = 886,660 # 图像宽度与高度
w_gap = screen_width/2 - imgwidth/2 # 图像左上角到左边缘的水平间隙
h_gap = screen_height/2 - imgheight/2 # 图像左上角到上边缘的垂直间隙
d = Sprite(visible=False)
if os.path.isfile('hot.dat'): # 如果存在hot.dat则读取内容
f = open('hot.dat',mode='rb')
miaolinks = pickle.load(f) # 加载所有曾经存储的描点,是一个字典
f.close()
else:
miaolinks = {} # 否则新建这个字典,它是url和热点区域的映射,如 {'www.scratch8.net':[(x1,y1,x2,y2),(a,-b,c,-d)]}
for link in miaolinks:
r = miaolinks[link]
draw_rect(r[-1])
leftkey = Mouse() # 鼠标左键
click = 0
item = None
stack = []
while True:
if leftkey.down() and click==0:
x1,y1 = mouse_pos() # 记录第一个点
y1 = -y1
click = 1
if leftkey.down():
x2,y2 = mouse_pos()
y2 = -y2
if item!=None:screen.cv.delete(item)
item = screen.cv.create_rectangle(x1,y1,x2,y2)
if leftkey.downup():
click=0
if abs(x1-x2)<5 or abs(y1-y2)<5:continue
item = screen.cv.create_rectangle(x1,y1,x2,y2)
## x1,y1,x2,y2 = x1+screen_width/2,y1+screen_height/2,x2+screen_width/2,y2+screen_height/2 # 转换为相对于左上角为原点的坐标
## x1,y1,x2,y2 = x1 - w_gap,y1 - h_gap,x2 - w_gap,y2 - h_gap
## print(x1,y1,x2,y2)
a,b,c,d = x1,y1,x2,y2 # 原先的保存下
x1 = x1 + imgwidth/2
y1 = y1 + imgheight/2
x2 = x2 + imgwidth/2
y2 = y2 + imgheight/2
url = screen.textinput('网址','请输入网址:')
if url:
print(url,':',x1,y1,x2,y2)
# x1,y1,x2,y2是在网页图像上的rect矩形区域,而a,-b,c,-d则是在本程序屏幕上为create_rectange画矩形准备的参数
miaolinks[url] = [(x1,y1,x2,y2),(a,-b,c,-d)] # 会覆盖以前的键值对
screen.update()
