Products
原生态宠物号 2025-01-04 17:16 33
#每天都是大雨倾盆的
#看着灰蓬蓬的天气
#整个人都会觉得慵懒
#你那?吗了雨里下雨了吗?
#下雨的天气也要学习
#PyQt 要一个很长的入门过程
#需要反复的学习和理解
#反复的实践才能应用
#加油,girl.
#一点一滴的努力,未来都会有回报。
#岁月静好,不去羡慕旁人,只做好自己,花朵总会绽放。
#我的电子宠物
import sys, pickle,datetime
from PyQt5 import QtCore, QtGui, QtWidgets, uic
formclass = uic.loadUiType("virtualpet.ui")[0]
class VirtualPetWindow(QtWidgets.QMainWindow, formclass):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.doctor = False
self.walking = False
self.sleeping = False
self.playing = False
self.eating = False
self.time_cycle = 0
self.hunger = 0
self.happiness = 8
self.health = 8
self.forceAwake = False
self.sleepImages = ["sleep1.gif","sleep2.gif","sleep3.gif",
"sleep4.gif"]
self.eatImages = ["eat1.gif", "eat2.gif"]
self.walkImages = ["walk1.gif", "walk2.gif", "walk3.gif",
"walk4.gif"]
self.playImages = ["play1.gif", "play2.gif"]
self.doctorImages = ["doc1.gif", "doc2.gif"]
self.nothingImages = ["pet1.gif", "pet2.gif", "pet3.gif"]
self.image\">
self.image\">
self.actionStop.triggered.connect(self.stop_Click)
self.actionFeed.triggered.connect(self.feed_Click)
self.actionWalk.triggered.connect(self.walk_Click)
self.actionPlay.triggered.connect(self.play_Click)
self.actionDoctor.triggered.connect(self.doctor_Click)
self.myTimer1 = QtCore.QTimer(self)
self.myTimer1.start(500)
self.myTimer1.timeout.connect(self.animation_timer)
self.myTimer2 = QtCore.QTimer(self)
self.myTimer2.start(5000)
self.myTimer2.timeout.connect(self.tick_timer)
filehandle = True
try:
file = open("savedata_vp.pkl", "rb")
except:
filehandle = False
if filehandle:
save_list = pickle.load(file)
file.close()
else:
save_list = [8, 8, 0, datetime.datetime.now(), 0]
self.happiness = save_list[0]
self.health = save_list[1]
self.hunger = save_list[2]
timestamp_then = save_list[3]
self.time_cycle = save_list[4]
difference = datetime.datetime.now() - timestamp_then
ticks = int(difference.seconds / 50)
for i in range(0, ticks):
self.time_cycle += 1
if self.time_cycle == 60:
self.time_cycle = 0
if self.time_cycle <= 48:
self.sleeping = False
if self.hunger < 8:
self.hunger += 1
else:
self.sleeping = True
if self.hunger < 8 and self.time_cycle % 3 == 0:
self.hunger += 1
if self.hunger == 7 and (self.time_cycle % 2 ==0) \\
and self.health > 0:
self.health -= 1
if self.hunger == 8 and self.health > 0:
self.health -=1
if self.sleeping:
self.image\">
else:
self.image\">
def sleep_test(self):
if self.sleeping:
result = (QtWidgets.QMessageBox.warning(self, 'WARNING',
"Are you sure you want to wake your pet up? He'll be unhappy about it!",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
QtWidgets.QMessageBox.No))
if result == QtWidgets.QMessageBox.Yes:
self.sleeping = False
self.happiness -= 4
self.forceAwake = True
return True
else:
return False
else:
return True
def doctor_Click(self):
if self.sleep_test():
self.image\">
self.doctor = True
self.walking = False
self.eating = False
self.playing = False
def feed_Click(self):
if self.sleep_test():
self.image\">
self.eating = True
self.walking = False
self.playing = False
self.doctor = False
def play_Click(self):
if self.sleep_test():
self.image\">
self.playing = True
self.walking = False
self.eating = False
self.doctor = False
def walk_Click(self):
if self.sleep_test():
self.image\">
self.walking = True
self.eating = False
self.playing = False
self.doctor = False
def stop_Click(self):
if not self.sleeping:
self.image\">
self.walking = False
self.eating = False
self.playing = False
self.doctor = False
def animation_timer(self):
if self.sleeping and not self.forceAwake:
self.image\">
self.image\">
if self.image\">
self.image\">
icon = QtGui.QIcon()
current_image = self.image\">
icon.addPixmap(QtGui.QPixmap(current_image),
QtGui.QIcon.Disabled, QtGui.QIcon.Off)
self.petPic.setIcon(icon)
self.progressBar_1.setProperty("value", (8-self.hunger)*(100/8.0))
self.progressBar_2.setProperty("value", self.happiness*(100/8.0))
self.progressBar_3.setProperty("value", self.health*(100/8.0))
def tick_timer(self):
self.time_cycle += 1
if self.time_cycle == 60:
self.time_cycle = 0
if self.time_cycle <= 48 or self.forceAwake:
self.sleeping = False
else:
self.sleeping = True
if self.time_cycle == 0:
self.forceAwake = False
if self.doctor:
self.health += 1
self.hunger += 1
elif self.walking and (self.time_cycle % 2 == 0):
self.happiness += 1
self.health += 1
self.hunger += 1
elif self.playing:
self.happiness += 1
self.hunger += 1
elif self.eating:
self.hunger -= 2
elif self.sleeping:
if self.time_cycle % 3 == 0:
self.hunger += 1
else:
self.hunger += 1
if self.time_cycle % 2 == 0:
self.happiness -= 1
if self.hunger > 8: self.hunger = 8
if self.hunger < 0: self.hunger = 0
if self.hunger == 7 and (self.time_cycle % 2 ==0) :
self.health -= 1
if self.hunger == 8:
self.health -=1
if self.health > 8: self.health = 8
if self.health < 0: self.health = 0
if self.happiness > 8: self.happiness = 8
if self.happiness < 0: self.happiness = 0
self.progressBar_1.setProperty("value", (8-self.hunger)*(100/8.0))
self.progressBar_2.setProperty("value", self.happiness*(100/8.0))
self.progressBar_3.setProperty("value", self.health*(100/8.0))
def closeEvent(self, event):
file = open("savedata_vp.pkl", "wb")
save_list = [self.happiness, self.health, self.hunger, \\
datetime.datetime.now(), self.time_cycle]
pickle.dump(save_list, file)
event.accept()
def menuExit_selected(self):
self.close()
app = QtWidgets.QApplication(sys.argv)
myapp = VirtualPetWindow()
myapp.show()
app.exec_()
#以上学习来自于《父与子的编程之旅:与小卡特一起学Python》(第3版),国内工信出版集团,人民邮电出版社
视频加载中...
搜集信息、寻找毛发、提取证据,无人机、热成像仪器、笼子网子手套,几小时到几十天的搜寻蹲守,只为寻找一只失踪猫咪或狗狗的下落……
帮助寻找丢失的猫狗,是孙锦荣团队最经常接到的单子。
这就是“宠物侦探”孙锦荣和他的团队的日常——为求助人寻找丢失的爱宠,收取费用和赏金。
在2012年这个概念尚且陌生时,孙锦荣迈出了第一步,在上海做起了全职宠物侦探。他接全国各地的单,曾帮助数千只宠物回家,并有了自己的一套方法论和设备。
孙锦荣团队在寻宠期间会用到的工具器材。来源:城市画报
十年间,他们见过“上天”趴在空调外机、危楼楼顶,“下地”躲到地板底下和下水道的猫,也见过走失后去别人家蹭吃蹭喝的金毛,以及从浦西上高架狂奔几十公里到浦东的边牧。
找到宠物后,他们一般能得到几千元到几万元的赏金,有人甚至打出“一栋房”“一辆保时捷”的悬赏,不过多为噱头。得到赏金并不容易,除了专业的设备, 要有缜密的判断和随机应变能力,是体力和脑力的双重消耗。
他们也要面对宠物主人的情绪宣泄,以及对方的谎言、压价甚至耍赖。
孙锦荣和团队还在做宠物义务救援的工作,类似宠物版的110。院子里堆满漆成绿色的木头小房子,他想做满1万个猫窝,送到愿意接收的小区里,用来给流浪猫喂食、居住。
“躲猫猫游戏”
晚上是抓猫的时机。
22点过半,来自广州的“90后”老吴背着一只半人高的黑色大包,爬上了上海普陀区一小区居民楼的四楼,想要抓住一只失联近一周的狸花猫。
他的背包里,一般会装有用于查看足迹的灯源、热成像搜索设备和无人机等,这些工具大部分是网购的,也有一部分是手工制作。
狸花猫躲在四楼一处悬空的平台上,很多天没有移动,应该也没有进食,老吴决定用食物引诱它钻进笼子。他从窗口处放下一只捕猫笼,里面放了猫条、打开的猫罐头,但猫不上钩。
老吴的同伴、1995年生的老高,在对面的居民楼用红外热成像仪观察猫咪的状况。“你看,这团红色的就是猫。”紧接着,那团红色开始沿着天台边缘动起来。
找到猫的位置,工作便完成了一半。老高说,在此之前,不确定性更多,除了要用无人机、热成像仪, 要对猫的粪便进行取样采集,方便在相关区域发现疑似粪便时做对比,也会收集猫毛储存,方便与主人核对。
老吴来到老高所在的这栋楼,提醒说走动的那只其实是个混淆视线的流浪橘猫,这小小的天台上,居然有四只猫在活动,但偏偏家养的那只迟迟不露面,顶多露出耳朵。
在猫咪“上钩”之前,他们的对峙还将持续下去。
这是老吴和老高日常工作中的普通一单。虽然他们称呼同事时喜欢在姓前加上“老”字,但实际上团队中多为90后甚至00后。他们的“师傅”,则是自称最早开始做宠物侦探的80后孙锦荣。
工作中的孙锦荣
2012年因做救助猫狗的义工,孙锦荣渐渐入行。那时候几乎没人做专业寻宠,我们对猫狗的认知也是功能性的。“市场几乎不存在,客户群体也还没建立起来,大家对于宠物的定位不一样。”
头三年,他的工作没什么起色,直到2016年,契机出现了。短视频平台“二更”给孙锦荣拍了一个专题片,片名就叫做《宠物侦探》,一下子将他推到了大众眼前,更多人也得以了解这个新行业。
在有了一定名气后,他又赶上了迅速扩展的宠物市场。
据咨询公司发布的《2021年国内宠物消费趋势白皮书》,2020年我国城镇宠物市场规模接近三千亿元,2015-2020年6年间复合增速达到32.8%。
这一本不被看好的职业,逐渐变成了一份“正经工作”,孙锦荣陆续招募了多名队友。 他的工作室有20人左右,年龄都不大。
不同的宠物,不同的主人
“找到我们的失主,大部分是和自家宠物在躲猫猫‘游戏’中败下阵的。”
孙锦荣说,丢失宠物后,大部分人都会选择自己搜寻一番,但往往发现,他们并不如想象中那么了解自家小动物,于是转而向猫咪侦探寻求帮助。
比如主人一般认为猫狗是能认出自己并且是贪食的,但宠物出逃后多会表现得很陌生,也不会去往常去的地点。
猫尤其喜欢躲藏,它们可以穿过狭窄的缝隙,藏到人无法到达的高处、隐蔽的下水道、危楼和枯井里。很多猫在走丢后会不停移动。“它觉得自己还没完全藏好,就会换个地方继续,几番折腾,一定要藏在一个很变态的地方。”孙锦荣说,有些猫把头藏好了,但屁股还在外面,自己看不见,就觉得别人也“看不见我了”。
而狗比猫爱热闹,喜欢往人多的地方跑。“尤其是柴犬、哈士奇和边牧,丢失后它完全不觉得自己是丢了。”孙锦荣说,它们会一颠一颠走得很欢快,完全不会失落害怕,一件案子中,甚至有狗上高速“释放自我”狂奔十几公里的。
除了猫狗,孙锦荣的团队也找过兔子、蜥蜴、鸟等各种动物。在性格各异的动物背后,主人也各不相同。孙锦荣觉得,养狗的人一般外向点,偏好和人社交;养猫的人则更独立,更有自己的思想。 两类人会有重叠。
为何走丢的宠物变多了?孙锦荣说,这和宠物市场的迅猛发展分不开,养猫养狗的人变多了,但在养之前可能并没有做足功课,只是跟风,养完后才发现有各种问题; 也会有主人疏忽,没有封窗或者牵绳的因素。
另一方面,城市扩展但配套还不到位,能给狗子跑的空间太小,很多狗比如边牧,处在体力无法消耗的状态中,便会选择拆家甚至出走。
从业十年,在孙锦荣看来,每个订单都是独特的,因为每个人、每只宠物的情况都不一样。
他们曾飞到郑州搜寻一宠物博主价值十几万的孟加拉豹猫,义务解救过头上套水桶的狗狗,找到过掉入河中的藏獒,也曾为蹲守一只躲藏起来、龇牙咧嘴的小猫熬最深的夜。
而这背后,总有一些直击人心的故事。
寻宠,也是寻找遗失的情感和生活
除了对猫狗习性了如指掌,宠物侦探有时候 要辨识人心。
孙锦荣提到一个“寻猫39天”的案例。
最长的一次,孙锦荣团队用了39天在野外找到被丢弃的小猫。
他回忆,去年冬天,他们接到了一位二十多岁女子丢猫的求助,一开始按正常的走失去查找,但后面发现了蹊跷,“我们里里外外地搜寻,却没有任何线索和猫的痕迹,因为猫根本不在这里。”
一天后,可能是看不下去女儿的煎熬,女子的父亲坦白,是他背着女儿,开车把猫带到上海和外地的交界处扔了。孙锦荣说,猫已经十几岁,可能陪伴着女孩走过了人生中重要的部分。
孙锦荣和同事去丢猫的地方寻找,那是一片高速公路旁的荒地,很多芦苇,搜索困难。他们连续找了多天,最后利用热成像无人机,在一片很密的草丛里,看到一只小猫咪窝着,正是走失的那只。
那是一只敏感的小猫,已经瘦骨嶙峋,脊背上凸显着骨头。它被丢弃时戴着有铃铛的项圈,行动时会暴露它的位置,限制了它的捕猎。孙锦荣说,能看出来猫咪曾尝试想挣脱项圈,但没有成功。项圈卡住了它的脖子和前爪到腋下的位置,找到时,勒紧的地方已经腐烂恶臭,项圈扒开时有白色小虫蠕动。
他们将这只小猫直接送医。“车开得很快,就怕猫见到主人之前就没了。”
孙锦荣说,找到猫后,女生接到通知时还以为是在做梦,不停道谢。至于为何猫被送走,他猜测,可能是因为女生怀孕了,老一辈总觉得养宠物对孩子不好。
这39天的寻猫经历,对孙锦荣来说,就像他创业的一个缩影,“一眼望不到边。”“我当时想着,找不到也没办法,但如果能找到,我知道它在哪里,但我不能带它回家,这么轻易放弃的话,我到退休那一天也会觉得有遗憾的。”
在孙锦荣接到的单子中,有不少养宠物的老人,他们的子女在外求学或工作,宠物为老人提供了重要的陪伴,让他们的生活更为规律,老人也会将对子女的一部分情感转移到宠物身上。所以,当宠物突然失踪时,老人会更加焦虑、伤心。
同样,大城市里变得“原子化”的年轻人,也因为孤独和压力更加需要宠物陪伴——在小小的出租屋里,有一个柔软的毛茸茸的动物一起生活,是一种慰藉。
“所以才会有一个词,叫宠物依赖症。” 孙锦荣说。
因为寻宠,他们需要“闯入”陌生人的家中,从求助人和他们所居住的环境中获取蛛丝马迹。
很多时候,求助人会把情绪先一股脑地宣泄在宠物侦探身上。他们或哭泣,或懊悔,或倾诉自己和宠物的点点滴滴,以及失去宠物的痛心。
“我们更需要的是清晰、理性的表述,说清楚宠物的年龄、花色、丢失时间和地点。”孙锦荣说,就如心理咨询师一样,有时他们需要对客户进行情绪疏导,直到他们讲清楚寻宠需要的线索,同时还要保持医生一样的耐心,告诉失主,寻宠和手术的成功率一样,并不能100%保证找到,只能尽力尝试。
赏金之下
一位宠物失主的求助信息
孙锦荣团队按时长和参与人数收费,如单人全设备寻找6小时是950元,双人则是1600元。还有赏金,“普通情况下,赏金是3000元起一只猫(狗)”,给第一眼发现猫(狗)的人,但如果最终没有找到宠物,赏金部分就没了。
无毛猫和布偶猫的赏金还会贵点。因为无毛猫没办法通过毛发痕迹追查,难度更大;而布偶因为市场价格高,被他人占为己有的概率更大。
有时候,孙锦荣觉得“赏金”这个词不太合适,找到活着的宠物时可以称之为赏金,但有时候只能找到尸体。“可能赏金这个词就得换一换了,或许用‘结案金额’更适合,代表我们宠物侦探的工作就到此为止。”
“遇到的最高悬赏是一部保时捷,但这类往往宠物丢失时间已很长,基本找不到,失主心里可能也很清楚。”他说,如果刚刚丢失宠物,就一下子把悬赏拔得那么高,10年间他是没见过的。
虽然干这行很久,但对于“赏金”部分,孙锦荣和团队并不会和客户签合同,仅靠口头协定。这有时会带来一些不快和纠纷。
有些订单中,他们发现,失主在一筹莫展的时候需要他们介入,但当有了线索、十拿九稳之时,就会劝他们回去算了,甚至抢他们半个身位,挡在他们前面,这样能以是自己先发现为由,拒绝支付赏金。“我们遇到过一个失主,觉得我们找得太快、太容易了,以此讨价还价。”孙锦荣觉得:“难道不是越快越好吗?”
他觉得,有时候,大家会追求一种心理上的平衡感。“觉得你没有付出太多劳动力,就把我的钱拿走了。”这种怨气会让失主做出一些奇怪的行径,比如找到宠物后,找借口硬是把团队留在外地多一天,其实就是憋了一口气。
在疫情之前,孙锦荣的团队一个月多的能接到几十甚至上百单,时间被切割成一块块的,深夜可能还在找一只猫,白天睡一会儿,又惊醒了。“就像狗一样,狗也是一会睡,一会就醒了。”
除了作息乱,最忙的时候他早上起来都要想一想,我在哪?可能早上他在青岛,下午就赶到北京了,北京的事情结束了,又赶到另外一个地方,每天面对的空间都是不一样的,这带来了一种长期的压抑。
“我们忙起来就是没有喘息的时间,可能最最放松的就是一个订单结束了,我们返程,或者是我们去奔赴下一个订单的路上的间隙,会稍微觉得舒服一点。”他说,如果单子排得很密,那就连喘息的时间都没有,一直在路上。这种长时间的煎熬,以及最后的成功带来的喜悦的反弹,周而复始。
“我觉得,这10年把我掏空了。”他说,他把自己造得太狠了。他越来越想只感受工作中美好的部分。“我现在其实有点退下来的感觉了,因为我在做短视频,出外勤少了很多。”
一万个猫窝
澎湃新闻今年6月底见到孙锦荣时,他穿着迷彩服,留着平头,语气疲倦,但坐得挺直,看上去比实际年龄——40岁要小一点。
他在浦东郊区租了两栋民房,相隔十几分钟车程,一栋自己住,一栋作为工作室,他称之为“基地”。在自住的小楼里,孙锦荣收养了两只橘猫,两只英短,以及一只本想训练成传递情报的“无人机”,但最后只学会了自言自语的鹦鹉。
他还在家中几面墙上挂着宠物主们送的小锦旗,上面写着“救我狗命”“神速寻猫”等标语。
抱着自己猫的孙锦荣,和墙上的一面锦旗。
孙锦荣一开始并不受支持。
中学毕业后,因父亲遭遇交通意外,孙锦荣的母亲领着当时还未成年的他来上海打工,没有专业技能,他更多是在搬家公司、印刷厂和纺织厂做体力活,一个月赚两三百块钱。
和很多来大城市的年轻人一样,孙锦荣时常陷入迷茫中,但又想做能出人头地的事。
2012年,寻宠还属于新概念,没什么可以参考的案例,是一种望不到边的职业选择。父母给他的建议是,与其在这件事上耗费时间,不如直接去找个工作,哪怕进厂打螺丝也比现在稳定。“我当时也动摇过,要不要去做常规的工作。”
他还是选择了自己的兴趣所在,拒绝了重复的、机械的工作。“流水线上的工作每一天都是重复,至少对我来说是这样的,8小时内都像是一个没有感情的机器。”他说,如果当时真的选择去打螺丝,或许“灵魂会被摧毁掉”。
“我觉得社会的进步就来源于子女不听父母话。如果每个子女都按照父母的规划去行进的话,社会不会有什么进步,每一代都应该接受更多的新鲜的事物。”孙锦荣说,他还是想鼓励年轻人多去体验这个世界,拥有自己的爱好,多尝试自己真正想做的事情,不要太早给自己框住。
孙锦荣团队中的其他队友来自各行各业,有做厨师的,有开货车的,也有工人。
1995年生的老高是一个健谈的安徽亳州小伙,体校毕业,加入孙锦荣团队之前干过空调外机维修、开过滴滴,最终还是换了工作。他说,在大城市很难找到归属感,没有技术或学历也很难找到好的工作,疫情之下,不少以前的同事都回到家乡。现在的工作,让他有了一点家的感觉,一方面自己喜欢猫猫狗狗,觉得是做好事,另一方面觉得能学到东西。
最近,他们在“基地”的后院做起了猫窝,房间里堆满了漆成绿色尖顶的木头小房子,墙上还挂着设计图纸。孙锦荣说,这都是小伙伴们一个个手工打出来的,他们想做满一万个猫窝,免费送到各个小区,作为流浪猫的住所和喂食点。
“一万个猫窝”计划
他们还开辟了一小块土地作为“猫咪墓地”,埋葬着几十只找到时已经死亡的小猫。土地上树立着小墓碑,刮开灰尘,上面写着去世小猫的昵称和年龄。孙锦荣说,疫情前,每年都会有父母带孩子来扫墓。
孙锦荣工作室后院视野。他们把其中一小块地用来做“猫咪墓地”。
近两年因为疫情,像他们这样需要开车四处跑、进入别人小区和家中寻宠的生意更不好做,尤其近两三个月,几乎没有出勤,但还是得照发工资。孙锦荣说,自己原本计划50岁就退休,现在这个计划可能要推迟了,或许“要把养老钱亏进去了”。
当下有些难熬,但他不后悔当初选择了这条路。“之前因为太累,我经历过濒死感,所以也越发想清楚了,来这个世界是干嘛的。对于我可能就是体验这个世界的,在这几十年甚至百年,能带来一点美好的东西。”他说。
“我们很多人生活没盼头,尤其年轻人不知道盼点什么。”孙锦荣有时候也会陷入同样的疲惫中。
后来,他在基地小院的后面种了葡萄和桑葚,他开始觉得,从来没有这么期盼过一个春天的到来,像种地的农民一样,有了一些盼头。每当感到焦虑,他就会开车一二十分钟,从住处到“基地”待会,干些活儿做做猫窝,或只是走走、吹吹风,都会觉得平静不少。
责任编辑:马世鹏 图片编辑:施佳慧
校对:刘威
Demand feedback