-
桌面 宠物
2006-02-23 09:05:59利用微软的Agent技术,初步实现桌面宠物。 -
C#桌面宠物
2019-04-19 19:24:33C#桌面宠物,动态,相关代码及实现开发环境为。net2010 -
c# 桌面宠物
2015-07-27 08:04:32c# 桌面宠物,类似QQ宠物,源代码 有喂食其他特效,桌面宠物源代码 -
vb做的桌面宠物 vb做的桌面宠物
2009-09-24 17:17:34vb做的桌面宠物vb做的桌面宠物vb做的桌面宠物vb做的桌面宠物 -
桌面宠物 软件
2013-06-24 21:28:18桌面宠物 软件 -
桌面宠物猫咪
2012-12-18 13:34:18桌面宠物猫fafa -
桌面宠物大全(zip)
2021-03-20 14:18:32还记得以前热门的QQ宠物吗,这个有趣的桌面宠物小游戏如今已经退出了历史舞台。但是如果你喜欢在你的桌面上弄一只有趣的虚拟桌面宠物的话,那么下面这些好玩的桌面宠物可以了解下,它就会呆在桌面上,你用鼠标可以与... -
JAVA桌面宠物
2021-01-19 18:02:57忄辰桌面宠物【静态】 最近寒假刚刚开始,然后时间很多,就想做一款桌面宠物,但是本人能力有限,只能做个静态的,其实我觉得静态也挺好看的是吧QAQ,想做动态的话可以参考链接2,用线程就可以实现了 感谢大佬的这两...忄辰桌面宠物【静态】+【动态】
最近寒假刚刚开始,然后时间很多,就想做一款桌面宠物,但是本人能力有限,只能做个大概的,其实我觉得做得也挺好看的是吧QAQ,想要详细做动态的话可以参考链接2,我做的比较简单
感谢大佬的这两片文章: 连接1.连接2
第一步:制作背景透明化
第二步:功能及代码【附图片】
第三步:动态代码片【附效果图】第一步
我们需要有一个背景透明化的图片,我是用PS的,也是第一次用,如果大佬有更好的办法可以帮助一下我。。。
首先我们需要准备一张图片
比如进击的巨人 (三笠)百度找的图
然后打开我们的PS应用,打开这张图片
选择这个魔法棒,点击空白处键盘上的delete
效果如下
然后我们就可以得到一张背景透明化的图片了啊哈哈
可以调整一下大小,按照你们想要的来调整就OK第二步
我们现在就开始写代码,写的比较乱,见谅,这里有的是直接搬运链接的代码,如果想要学习可以去原链接看
主函数//创建一个JFrame JFrame frame=new JFrame("桌面宠物"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //框体透明 frame.setUndecorated(true);//取消标题栏 frame.setBackground(new Color(0,0,0,0));//背景透明 //增加托盘图标 setTray(frame); //设置位置并显示在最前端 frame.setAlwaysOnTop(true); //设置取消窗体任务栏图标 frame.setType(JFrame.Type.UTILITY); frame.setVisible(true); frame.setSize(200,200); frame.setLocation(1670,20); //运行时间 jishiqi(); //全局位置变量,用于鼠标在窗口上的位置 Point origin = new Point(); //添加图标信息 JLabel label=new JLabel(); ImageIcon icon=new ImageIcon("tupian\\三笠.png");//图片的路径 int chongwuwidth=icon.getIconWidth(); int chongwuheight=icon.getIconHeight(); icon.setImage(icon.getImage().getScaledInstance(chongwuwidth, chongwuheight, Image.SCALE_AREA_AVERAGING)); label.setBounds(frame.getX(), frame.getY(), chongwuwidth, chongwuheight); label.setIcon(icon); frame.add(label); //添加窗体监听器 frame.addMouseListener(new MouseAdapter() { // 按下(mousePressed 不是点击,而是鼠标被按下没有抬起) public void mousePressed(MouseEvent e) { origin.x=e.getX(); origin.y=e.getY(); } public void mouseClicked(MouseEvent e) { if(e.getButton()==MouseEvent.BUTTON3) setable(frame,e.getComponent(),e.getX(),e.getY(),label); } }); frame.addMouseMotionListener(new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { // TODO 自动生成的方法存根 } @Override public void mouseDragged(MouseEvent e) { Point p=frame.getLocation(); // 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置 frame.setLocation(p.x+e.getX()-origin.x,p.y+e.getY()-origin.y); } }); frame.validate(); }
托盘,可以将你的桌宠图标放在托盘图标里面
代码如下private static void setTray(JFrame frame) { if(SystemTray.isSupported())//判断系统是否支持系统托盘 { SystemTray tray=SystemTray.getSystemTray();//获取当前系统的托盘 //为托盘添加一个右键弹出式菜单 PopupMenu menu=new PopupMenu(); MenuItem openItem=new MenuItem("打开"); openItem.addActionListener(e->frame.setVisible(true)); MenuItem closeItem=new MenuItem("最小化"); closeItem.addActionListener(e->frame.setVisible(false)); MenuItem exItem=new MenuItem("退出"); exItem.addActionListener(e->System.exit(0)); menu.add(openItem); menu.addSeparator(); menu.add(closeItem); menu.addSeparator(); menu.add(exItem); ImageIcon icon=new ImageIcon("tupian\\可爱.png"); Image image=icon.getImage().getScaledInstance(icon.getIconWidth(), icon.getIconHeight(),Image.SCALE_DEFAULT); TrayIcon trayIcon=new TrayIcon(image,"桌面宠物", menu); trayIcon.setImageAutoSize(true);//自适应尺寸*很重要 try { tray.add(trayIcon); } catch (AWTException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } } }
计时器,可以统计你的桌宠累计在线时长
代码如下public static void jishiqi() { int time=60000; ActionListener jishi=new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { RandomAccessFile raf=new RandomAccessFile("time.txt","rw"); int times=Integer.parseInt(raf.readLine())+1; raf.seek(0); raf.write((times+"").getBytes()); raf.close(); } catch (NumberFormatException | IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } } }; new javax.swing.Timer(time,jishi).start(); }
弹出式菜单,当你鼠标右键点击宠物时,会有关于宠物属性,宠物设置,宠物选择等
代码如下public static void setable(JFrame frame,Component b,int x,int y,JLabel label) { JPopupMenu menu=new JPopupMenu(); JMenuItem shuxingItem=new JMenuItem("宠物设置"); shuxingItem.addActionListener(e->set()); JMenuItem selectItem=new JMenuItem("宠物属性"); selectItem.addActionListener(e->{ try { able(); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } }); JMenuItem setItem=new JMenuItem("宠物选择"); setItem.addActionListener(e->select(frame,label)); JMenuItem qqItem=new JMenuItem("联系作者"); qqItem.addActionListener(e->JOptionPane.showMessageDialog(null,"相逢何必曾相识","联系作者",1)); menu.add(shuxingItem); menu.addSeparator(); menu.add(selectItem); menu.addSeparator(); menu.add(setItem); menu.addSeparator(); menu.add(qqItem); menu.show(b, x, y); }
宠物属性面板
代码如下public static JFrame able() throws IOException { //宠物属性变量 RandomAccessFile raf=new RandomAccessFile("time.txt","rw"); int time=Integer.parseInt(raf.readLine()); raf.close(); int level; if(time<60) level=1; else if(time>=60&&time<=200) level=2; else if(time>200&&time<=500) level=3; else if(time>500&&time<=100) level=4; else level=5; BufferedReader bufferedReader=new BufferedReader(new FileReader("name.txt")); String chongwunameString=""; String zhurennameString=""; String string=""; while((string=bufferedReader.readLine())!=null) { chongwunameString=string; zhurennameString=bufferedReader.readLine(); } bufferedReader.close(); //宠物属性面板 JFrame frame=new JFrame("宠物属性"); frame.setSize(400,300); frame.setLocationRelativeTo(null); frame.setLayout(null); frame.setResizable(false); frame.setVisible(true); JPanel panel=new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT,30,20)); JLabel label=new JLabel("宠物名字: "+chongwunameString); JLabel label2=new JLabel("主人名字: "+zhurennameString); JLabel label3=new JLabel("等级: lv "+level+" "); JLabel label4=new JLabel("累计在线时长: "+time+"分钟"); panel.add(label3); panel.add(label); panel.add(label2); panel.add(label4); panel.setBounds(0, 0,200, 300); frame.add(panel); frame.validate(); return frame; }
宠物设置面板
代码如下public static JFrame set() { //宠物设置面板 JFrame frame=new JFrame("宠物设置"); frame.setSize(250,250); frame.setLocationRelativeTo(null); frame.setLayout(null); frame.setResizable(false); frame.setVisible(true); JPanel panel=new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT,5,10)); panel.setBounds(0, 0, 250,150); JLabel label=new JLabel("宠物名字:"); JLabel label2=new JLabel("主人名字:"); JTextField jTextField=new JTextField(20); JTextField jTextField2=new JTextField(20); panel.add(label); panel.add(jTextField); panel.add(label2); panel.add(jTextField2); frame.add(panel); JButton button=new JButton("确认设置"); button.setBounds(75, 165, 100,30); frame.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { FileWriter fileWriter=new FileWriter("name.txt"); fileWriter.write(jTextField.getText()+"\n"); fileWriter.write(jTextField2.getText()); fileWriter.close(); JOptionPane.showMessageDialog(null,"设置完成","设置",1); frame.setVisible(false); } catch (IOException e1) { // TODO 自动生成的 catch 块 e1.printStackTrace(); } } }); return frame; }
宠物选择面板
代码如下public static void select(JFrame frame,JLabel label) { //宠物选择面板 JFrame frame2=new JFrame("宠物选择"); frame2.setSize(450,300); frame2.setLocationRelativeTo(null); frame2.setLayout(null); frame2.setResizable(false); frame2.setVisible(true); JPanel panel=new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel label2=new JLabel(" 古风汉服"); ImageIcon icon=new ImageIcon("tupian\\古风汉服.png"); JLabel label3=new JLabel(); icon.setImage(icon.getImage().getScaledInstance(icon.getIconWidth(),icon.getIconHeight(),Image.SCALE_DEFAULT)); label3.setIcon(icon); panel.add(label2); panel.add(label3); panel.setBounds(0, 0, 200,190); frame2.add(panel); JPanel panel2=new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEFT)); JLabel nameLabel=new JLabel(" 薇尔莉特"); ImageIcon icon2=new ImageIcon("tupian\\人类精灵.png"); JLabel iconLabel=new JLabel(); icon.setImage(icon.getImage().getScaledInstance(icon2.getIconWidth(), icon2.getIconHeight(), Image.SCALE_DEFAULT)); iconLabel.setIcon(icon2); panel2.add(nameLabel); panel2.add(iconLabel); panel2.setBounds(225, 0, 200, 190); frame2.add(panel2); ButtonGroup buttonGroup=new ButtonGroup(); JRadioButton gufengbut=new JRadioButton(); JRadioButton jinglingbut=new JRadioButton(); gufengbut.setBounds(85, 200, 40, 40); jinglingbut.setBounds(325, 200, 40, 40); buttonGroup.add(jinglingbut); buttonGroup.add(gufengbut); frame2.add(gufengbut); frame2.add(jinglingbut); Button button=new Button("选择"); button.setBounds(160, 230, 100, 40); frame2.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(gufengbut.isSelected()) { selectchongwu(frame, label, "tupian\\微笑.png"); frame2.setVisible(false); } if(jinglingbut.isSelected()) { selectchongwu(frame, label, "tupian\\薇尔莉特.png"); frame2.setVisible(false); } } }); frame2.validate(); }
这个是宠物的替换函数
public static void selectchongwu(JFrame frame,JLabel label,String nameString) { ImageIcon icon=new ImageIcon(nameString); int chongwuwidth=icon.getIconWidth(); int chongwuheight=icon.getIconHeight(); icon.setImage(icon.getImage().getScaledInstance(chongwuwidth, chongwuheight, Image.SCALE_AREA_AVERAGING)); label.setIcon(icon); }
第三步
如何做动态的,这又是一个问题,首先我们需要Pr软件,然后用你想要的GIF图放进去,第一次用Pr没人教真的,希望大佬有更高的办法
如下图所示
然后我们选择那个导出帧和下一帧,将GIF变成图片知道全部把帧变成图片
然后将得到的图片背景透明化,参考第一步。重命名为如b1,b2之类的,好进行链接,之后开始写代码(采用的是链接2中的代码)new Thread(() -> { int i=1; try{ while (true){ Thread.sleep(200); selectchongwu(frame, label,"tupian\\b"+ i++ +".png");//这个是你图片的路径 if(i>29) { Thread.sleep(500); i=1; } } } catch (Exception e){ e.printStackTrace(); } }).start();
然后我们就会得到一只会动的桌宠,如果你想按左键才能动可以添加监听器等
效果如下
这些大家都可以改,我学的不是很好,希望可以被大佬指教出来问题
完。 -
python桌面宠物_写个桌面挂件 | 手把手带大家做只桌面宠物呗
2020-12-09 20:56:22原文链接网页链接mp.weixin.qq.com效果展示桌面宠物https://www.zhihu.com/video/1230197062286778368...就简单带大家做一只桌面宠物吧~废话不多说,让我们愉快地开始吧~开发工具Python版本:3.6.4相关模块:Py...原文链接网页链接mp.weixin.qq.com
效果展示
桌面宠物https://www.zhihu.com/video/1230197062286778368
导语
前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~
废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
PyQt5模块;
以及一些Python自带的模块。
原理简介
既然要写个桌面宠物,首先当然是要找宠物的图片素材啦。这里我们使用的是来自shimiji这款手机APP上的宠物图片素材,例如皮卡丘:
我下了大约60多种宠物的图片素材供大家选择:
在相关文件里都打包一起提供了,所以这里就不分享爬虫代码了(我挑选了一下,只要不是我觉得特别丑的,我基本都保留了),别给人家服务器带来不必要的压力。
接下来,我们就可以开始设计我们的桌面宠物啦。鉴于网上用python写的桌面挂件基本都是基于tkinter的,为了突出公众号的与众不同,这里我们采用PyQt5来实现我们的桌面宠物。
首先,我们来初始化一个桌面宠物的窗口组件:
class DesktopPet(QWidget):
def __init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
self.show()
它的效果是这样子的:
接下来,我们设置一下窗口的属性让更适合作为一个宠物的窗口:
# 初始化
self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow)
self.setAutoFillBackground(False)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.repaint()
并随机导入一张宠物图片来看看运行效果:
# 随机导入一个宠物
self.pet_images, iconpath = self.randomLoadPetImages()
# 当前显示的图片
self.image = QLabel(self)
self.setImage(self.pet_images[0][0])
其中随机导入一个宠物的所有图片的函数代码实现如下:
'''随机导入一个桌面宠物的所有图片'''
def randomLoadPetImages(self):
pet_name = random.choice(list(cfg.PET_ACTIONS_MAP.keys()))
actions = cfg.PET_ACTIONS_MAP[pet_name]
pet_images = []
for action in actions:
pet_images.append([self.loadImage(os.path.join(cfg.ROOT_DIR, pet_name, 'shime'+item+'.png')) for item in action])
iconpath = os.path.join(cfg.ROOT_DIR, pet_name, 'shime1.png')
return pet_images, iconpath
当然,我们也希望宠物每次在桌面上出现的位置是随机的,这样会更有趣一些:
'''随机到一个屏幕上的某个位置'''
def randomPosition(self):
screen_geo = QDesktopWidget().screenGeometry()
pet_geo = self.geometry()
width = (screen_geo.width() - pet_geo.width()) * random.random()
height = (screen_geo.height() - pet_geo.height()) * random.random()
self.move(width, height)
现在,运行我们的程序时,效果是这样子的:
好像蛮不错的呢~等等,好像有问题,重新设置了窗口属性之后,这玩意咋退出啊?在宠物右上角加个×这样的符号又好像很奇怪?
别急,我们可以给我们的桌面宠物添加一个托盘图标,以实现桌面宠物程序的退出功能:
# 设置退出选项
quit_action = QAction('退出', self, triggered=self.quit)
quit_action.setIcon(QIcon(iconpath))
self.tray_icon_menu = QMenu(self)
self.tray_icon_menu.addAction(quit_action)
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon(iconpath))
self.tray_icon.setContextMenu(self.tray_icon_menu)
self.tray_icon.show()
效果是这样子的:
OK,这样好像有模有样了呢~但是好像还是不太对的样子,这宠物每次在桌面生成的位置是随机的,但是我们却无法调整这个宠物的位置,这显然不合理,作为一个桌面宠物,你肯定不能在妨碍主人工作的位置啊!要不我们来写一下鼠标按下、移动以及释放时的函数吧,这样就可以用鼠标拖动它了:
'''鼠标左键按下时, 宠物将和鼠标位置绑定'''
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.is_follow_mouse = True
self.mouse_drag_pos = event.globalPos() - self.pos()
event.accept()
self.setCursor(QCursor(Qt.OpenHandCursor))
'''鼠标移动, 则宠物也移动'''
def mouseMoveEvent(self, event):
if Qt.LeftButton and self.is_follow_mouse:
self.move(event.globalPos() - self.mouse_drag_pos)
event.accept()
'''鼠标释放时, 取消绑定'''
def mouseReleaseEvent(self, event):
self.is_follow_mouse = False
self.setCursor(QCursor(Qt.ArrowCursor))
效果如下:
哈哈,越来越像样了呢~最后,作为一个活泼的宠物,你不能这么呆板,一动也不动吧?好歹要学会做做表情逗主人开心吧?OK,我们先来设置一个定时器:
# 每隔一段时间做个动作
self.timer = QTimer()
self.timer.timeout.connect(self.randomAct)
self.timer.start(500)
定时器每隔一段时间切换一下选中的宠物的图片,以达到宠物做表情动作的动画效果(视频是一帧帧的图片组成的这种基础内容就不需要我来科普了吧T_T)。当然,这里我们必须对图片进行动作分类(在做同一个动作的图片属于同一类),保证宠物做表情动作时的连贯性。具体而言,代码实现如下:
'''随机做一个动作'''
def randomAct(self):
if not self.is_running_action:
self.is_running_action = True
self.action_images = random.choice(self.pet_images)
self.action_max_len = len(self.action_images)
self.action_pointer = 0
self.runFrame()
'''完成动作的每一帧'''
def runFrame(self):
if self.action_pointer == self.action_max_len:
self.is_running_action = False
self.action_pointer = 0
self.action_max_len = 0
self.setImage(self.action_images[self.action_pointer])
self.action_pointer += 1
OK,大功告成了~完整源代码详见相关文件。
相关文件
-
桌面宠物——不做单身狗
2018-12-04 12:11:32桌面宠物,c# WinForm编写的一个桌面宠物小游戏。 -
桌面宠物.zip——
2020-03-15 20:56:13一个桌面宠物,网上看到的,以前好像用过,但是不想折腾了,桌面就这样吧,随便看看—————————————— -
轻音少女DTA(桌面宠物、桌面时钟、桌面图标、鼠标指针、音效)
2020-02-12 15:53:24轻音少女的DTA ...包括桌面宠物、桌面时钟、桌面图标、鼠标指针、音效等 桌面宠物、桌面时钟的右键功能已汉化 桌面图标、鼠标指针不用汉化 音效未原本日语音效 资源来源于网络,免费共享,侵删 -
linux桌面宠物
2020-02-13 20:48:09环境: ubuntu19.10 xfce4 步骤如下: ...python start.py(启动桌面宠物) 小技巧: 可以把你下载的宠物给备份起来,以后就不用重复下载啦. 效果: 目前宠物总是喜欢待在最下面,脚本...环境:
ubuntu19.10
xfce4
步骤如下:
python getpet.py(获取宠物动作图片)
然后会弹出来一个对话框,对话框里面你看中哪个宠物就用鼠标双击一下,然后终端就会开始下载这个宠物的图片
python start.py(启动桌面宠物)
小技巧:
可以把你下载的宠物给备份起来,以后就不用重复下载啦.
效果:
目前宠物总是喜欢待在最下面,脚本还需要改进啊.
#------------------------------------------------附录--------------------------------------------------------------------------------------
getpet.py
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import requests import threading import os import zipfile from PIL import Image class Workchange(QThread): """docstring for WorkThread""" change_done = pyqtSignal() def __init__(self): super(Workchange, self).__init__() def run(self): url = self.url name = url.split('/')[-1] + '.zip' print('正在下载资源',name) data = requests.get(url).content with open(name,'wb') as f: f.write(data) print('下载完成!') # path = os.environ['HOME']+'/shimeji/' path="./" if not os.path.exists(path): os.makedirs(path) print('正在解压资源...') z = zipfile.ZipFile(name, 'r') z.extractall(path=path) z.close() for i in range(1,47): os.rename(path + 'shime%s.png'% str(i),path+str(i)+'.png') pri_image = Image.open(path+'%s.png' %str(i)) pri_image.transpose(Image.FLIP_LEFT_RIGHT).save(path+'-%s.png'%str(i)) for i in os.listdir(path): os.system('convert %s %s'%(path+i,path+i)) print('解压完成') os.remove(name) self.change_done.emit() class Workinit(QThread): """docstring for WorkThread""" init_done = pyqtSignal(dict) def __init__(self): super(Workinit, self).__init__() def run(self): for i in range(3,90): threading.Thread(target=self.load,args=(i,)).start() def load(self,i): url = ''' http://pepeswap.com/thumb/%s''' %str(i) data = requests.get(url).content name = str(i) dict_data = dict(data=data,name=name) self.init_done.emit(dict_data) class DQListWidget(QListWidget): def __init__(self): super(DQListWidget, self).__init__() self.workinit = Workinit() self.workchange = Workchange() self.workchange.change_done.connect(self.change_done) self.workinit.init_done.connect(self.load_picture) self.workinit.start() self.itemDoubleClicked.connect(self.change) def change_done(self): QMessageBox.about(self,'提示','更换完成!(*>﹏<*)') def change(self,item): self.workchange.url = 'http://pepeswap.com/mascot/' + item.text() self.workchange.start() def load_picture(self,dict_data): item = QListWidgetItem(dict_data['name']) item.setSizeHint(QSize(10, 128)) self.addItem(item) pixmap = QPixmap() label = QLabel() pixmap.loadFromData(dict_data['data']) label.setPixmap(pixmap) self.setItemWidget(item,label) class Mywin(QWidget): def __init__(self): super(Mywin, self).__init__() list_ = DQListWidget() layout = QVBoxLayout(self) layout.addWidget(list_) self.setLayout(layout) app = QApplication(sys.argv) mywin = Mywin() # 实例化一个窗口小部件 mywin.setWindowTitle('Hello world!') # 设置窗口标题 mywin.show() #显示窗口 sys.exit(app.exec())
start.py
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import time import random import os def random_probability(r): s = random.randint(1,100) if r >= s: return True else: return False class Donghua(QWidget): def __init__(self): super(Donghua, self).__init__() self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.HEIGHT = self.screenRect.height() self.WIDTH = self.screenRect.width() self.setWindowFlags(Qt.FramelessWindowHint) # self.setWindowFlags(Qt.SplashScreen) self.setAttribute(Qt.WA_TranslucentBackground) self.timer = QTimer() self.timer.timeout.connect(self.update) self.img_timer = QTimer() self.img_timer.timeout.connect(self.update_img) self.label = QLabel(self) self.label.setScaledContents(True) layout = QVBoxLayout(self) layout.addWidget(self.label) self.setLayout(layout) self.index = 0 self.x = 0 self.is_right = True self.m_flag = False self.action_dcit = { 'left_go':(1,3), 'right_go':(-3,-1), 'left_hold':(5,7), 'right_hold':(-7,-5), 'left_release':(4,4), 'right_release':(-4,-4), 'left_down':(18,19), 'right_down':(-19,-18), 'left_crawl':(12,14), 'right_crawl':(-14,-12), # 'left_rest':(15,17), # 'right_rest':(-17,-15), 'left_rest':(26,27), 'right_rest':(-27,-26), 'left_rest2':(27,29), 'right_rest2':(-29,-27), } self.action = 'right_release' self.pre_action = '' # 控制窗体移动及各种动作切换计时器 self.timer.start(100) # 控制图片切换计时器 self.img_timer.start(200) #监听鼠标动作 def mousePressEvent(self, event): x = (event.globalPos()-self.pos()).x() y = (event.globalPos()-self.pos()).y() if event.button() == Qt.LeftButton and x < 128 and y < 128: self.m_flag = True self.m_Position = event.globalPos()-self.pos() # 获取鼠标相对窗口的位置 event.accept() if self.is_right: self.action='right_hold' else: self.action='left_hold' self.setCursor(QCursor(Qt.OpenHandCursor)) def mouseMoveEvent(self, QMouseEvent): if Qt.LeftButton and self.m_flag: self.move(QMouseEvent.globalPos()-self.m_Position) # 更改窗口位置 QMouseEvent.accept() #鼠标左键释放 def mouseReleaseEvent(self, QMouseEvent): self.m_flag = False if self.is_right: self.action = 'right_release' else: self.action = 'left_release' #手动将其放入屏幕边缘 if self.x <= 0 and self.y > 0: self.action = 'left_crawl' elif self.x + self.width >= self.WIDTH and self.y > 0: self.action = 'right_crawl' self.setCursor(QCursor(Qt.ArrowCursor)) #动作更新 def update(self): self.width = self.geometry().width() self.height = self.geometry().height() self.x = self.geometry().x() self.y = self.geometry().y() # print(self.x,self.y) exec('self.%s()'% self.action) def right_crawl(self): if self.y > 0: self.y -= 10 self.setGeometry(self.x,self.y,100,100) else: self.action = 'right_release' def left_crawl(self): if self.y > 0: self.y -= 10 self.setGeometry(self.x,self.y,100,100) else: self.action = 'left_release' def right_down(self): if self.index+1 == self.action_dcit[self.action][1]: self.action = 'right_go' def left_down(self): if self.index+1 == self.action_dcit[self.action][1]: self.action = 'left_go' def right_release(self): if self.y + self.height > self.HEIGHT: self.action = 'right_down' else: self.action = 'right_release' self.y += 100 self.setGeometry(self.x,self.y,100,100) def left_release(self): if self.y + self.height > self.HEIGHT: self.action = 'left_down' else: self.action = 'left_release' self.y += 100 self.setGeometry(self.x,self.y,100,100) def right_go(self): self.x += 5 self.action = 'right_go' if self.x + self.width> self.WIDTH: if random_probability(30): self.action = 'right_crawl' else: self.is_right = False self.action = 'left_go' if random_probability(1): self.action = 'right_rest' self.setGeometry(self.x,self.y,100,100) def left_go(self): self.x -= 5 self.action = 'left_go' if self.x < 0: if random_probability(30): self.action = 'left_crawl' else: self.is_right = True self.action = 'right_go' if random_probability(1): self.action = 'left_rest' self.setGeometry(self.x,self.y,100,100) def right_rest(self): if random_probability(1): self.action = 'right_go' def left_rest(self): if random_probability(1): self.action = 'left_go' def right_hold(self): pass def left_hold(self): pass #更新图片 def update_img(self): start_index,end_index = self.action_dcit[self.action] if self.pre_action != self.action: self.index = start_index self.pre_action = self.action if self.index == end_index: self.index = start_index else: self.index += 1 q = QPixmap(path +'%s.png' % self.index) self.label.setPixmap(q) if __name__ == '__main__': path = "./" app = QApplication(sys.argv) mywin = Donghua() mywin.show() sys.exit(app.exec())
-
Python脚本项目源码-桌面宠物
2021-02-27 07:57:51Python脚本项目源码-桌面宠物 -
python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗
2020-12-30 07:15:30导语前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~废话不多说,让我们愉快地开始吧~开发工具...导语
前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~
废话不多说,让我们愉快地开始吧~
开发工具Python版本:3.6.4
相关模块:PyQt5模块;
以及一些Python自带的模块。
原理简介
既然要写个桌面宠物,首先当然是要找宠物的图片素材啦。这里我们使用的是来自shimiji这款手机APP上的宠物图片素材,例如皮卡丘:
我下了大约60多种宠物的图片素材供大家选择:
在相关文件里都打包一起提供了,所以这里就不分享爬虫代码了(我挑选了一下,只要不是我觉得特别丑的,我基本都保留了),别给人家服务器带来不必要的压力。
接下来,我们就可以开始设计我们的桌面宠物啦。鉴于网上用python写的桌面挂件基本都是基于tkinter的,为了突出公众号的与众不同,这里我们采用PyQt5来实现我们的桌面宠物。
首先,我们来初始化一个桌面宠物的窗口组件:class DesktopPet(QWidget):def __init__(self, parent=None, **kwargs):super(DesktopPet, self).__init__(parent)self.show()
它的效果是这样子的:
接下来,我们设置一下窗口的属性让更适合作为一个宠物的窗口:# 初始化self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow)self.setAutoFillBackground(False)self.setAttribute(Qt.WA_TranslucentBackground, True)self.repaint()
并随机导入一张宠物图片来看看运行效果:# 随机导入一个宠物
self.pet_images, iconpath = self.randomLoadPetImages()# 当前显示的图片
self.image = QLabel(self)
self.setImage(self.pet_images[0][0])
其中随机导入一个宠物的所有图片的函数代码实现如下:'''随机导入一个桌面宠物的所有图片'''def randomLoadPetImages(self):
pet_name = random.choice(list(cfg.PET_ACTIONS_MAP.keys()))
actions = cfg.PET_ACTIONS_MAP[pet_name]
pet_images = []for action in actions:
pet_images.append([self.loadImage(os.path.join(cfg.ROOT_DIR, pet_name, 'shime'+item+'.png')) for item in action])
iconpath = os.path.join(cfg.ROOT_DIR, pet_name, 'shime1.png')return pet_images, iconpath
当然,我们也希望宠物每次在桌面上出现的位置是随机的,这样会更有趣一些:'''随机到一个屏幕上的某个位置'''
def randomPosition(self):
screen_geo = QDesktopWidget().screenGeometry()
pet_geo = self.geometry()width = (screen_geo.width() - pet_geo.width()) * random.random()height = (screen_geo.height() - pet_geo.height()) * random.random()
self.move(width, height)
现在,运行我们的程序时,效果是这样子的:
好像蛮不错的呢~等等,好像有问题,重新设置了窗口属性之后,这玩意咋退出啊?在宠物右上角加个×这样的符号又好像很奇怪?
别急,我们可以给我们的桌面宠物添加一个托盘图标,以实现桌面宠物程序的退出功能:# 设置退出选项
quit_action = QAction('退出', self, triggered=self.quit)
quit_action.setIcon(QIcon(iconpath))self.tray_icon_menu = QMenu(self)self.tray_icon_menu.addAction(quit_action)self.tray_icon = QSystemTrayIcon(self)self.tray_icon.setIcon(QIcon(iconpath))self.tray_icon.setContextMenu(self.tray_icon_menu)self.tray_icon.show()
效果是这样子的:
OK,这样好像有模有样了呢~但是好像还是不太对的样子,这宠物每次在桌面生成的位置是随机的,但是我们却无法调整这个宠物的位置,这显然不合理,作为一个桌面宠物,你肯定不能在妨碍主人工作的位置啊!要不我们来写一下鼠标按下、移动以及释放时的函数吧,这样就可以用鼠标拖动它了:'''鼠标左键按下时, 宠物将和鼠标位置绑定'''def mousePressEvent(self, event):if event.button() == Qt.LeftButton:
self.is_follow_mouse = True
self.mouse_drag_pos = event.globalPos() - self.pos()
event.accept()
self.setCursor(QCursor(Qt.OpenHandCursor))'''鼠标移动, 则宠物也移动'''def mouseMoveEvent(self, event):if Qt.LeftButton and self.is_follow_mouse:
self.move(event.globalPos() - self.mouse_drag_pos)
event.accept()'''鼠标释放时, 取消绑定'''def mouseReleaseEvent(self, event):
self.is_follow_mouse = False
self.setCursor(QCursor(Qt.ArrowCursor))
效果如下:
哈哈,越来越像样了呢~最后,作为一个活泼的宠物,你不能这么呆板,一动也不动吧?好歹要学会做做表情逗主人开心吧?OK,我们先来设置一个定时器:# 每隔一段时间做个动作self.timer = QTimer()self.timer.timeout.connect(self.randomAct)self.timer.start(500)
定时器每隔一段时间切换一下选中的宠物的图片,以达到宠物做表情动作的动画效果(视频是一帧帧的图片组成的这种基础内容就不需要我来科普了吧T_T)。当然,这里我们必须对图片进行动作分类(在做同一个动作的图片属于同一类),保证宠物做表情动作时的连贯性。具体而言,代码实现如下:'''随机做一个动作'''def randomAct(self):if not self.is_running_action:self.is_running_action = Trueself.action_images = random.choice(self.pet_images)self.action_max_len = len(self.action_images)self.action_pointer = 0self.runFrame()'''完成动作的每一帧'''def runFrame(self):if self.action_pointer == self.action_max_len:self.is_running_action = Falseself.action_pointer = 0self.action_max_len = 0self.setImage(self.action_images[self.action_pointer])self.action_pointer += 1
OK,大功告成了~完整源代码详见相关文件。
相关文件
-
桌面宠物大合集桌面宠物大合集
2009-08-14 09:52:43桌面宠物大合集更多精彩,欢迎来我的论坛逛逛! 快乐论坛630 http://hanranran.5d6d.com/bbs.php 快乐网赚论坛 http://wangzhuan630.5d6d.com/bbs.php 中国网赚论坛 ... -
桌面宠物Day1素材
2017-12-03 22:32:22桌面宠物Day1素材:http://blog.csdn.net/shenpibaipao/article/details/78704714 -
桌面宠物秀,电脑桌面美化
2019-05-22 13:57:18桌面宠物秀是一款非常好玩的电脑桌面工具,你可以将宠物养在你的桌面上,随意拖动宠物到屏幕的任何一个角落,放置的宠物会在桌面进来来回的游动,为电脑桌面添加乐趣。 源码获取方式,关注公总号RaoRao1994,... -
unity桌面宠物demo.unitypackage
2021-03-26 10:57:13简单的一个uniy桌面宠物demo,还有lol暴走萝莉的几款皮肤+模型+动作 -
易语言宠物源码,易语言服务端源码,易语言桌面宠物游戏源码
2020-07-16 21:07:40易语言桌面宠物游戏源码,桌面宠物游戏,写配置文件,读配置文件,图片选择,选择种类,确定种类,宠物孵化,初始化,显示信息,随机获得宝石,标签显示,体力检测,随机怪物,显示PK信息,我方信息,怪物信息,怪物回合,显示购物信息... -
易语言宠物源码,易语言服务端源码,易语言桌面宠物0.1源码
2020-07-16 21:06:33易语言桌面宠物0.1源码,桌面宠物0.1,写配置文件,读配置文件,图片选择,选择种类,确定种类,宠物孵化,初始化,显示信息,随机获得宝石,标签显示,体力检测,随机怪物,显示PK信息,我方信息,怪物信息,怪物回合,显示购物信息,... -
桌面宠物秀游动的金鱼C#源码
2021-03-16 02:23:36内容索引:C#源码,游戏开发,桌面宠物,C#游戏源码 C#桌面宠物秀源代码,打开运行你会发现一个活生生的金钱在屏幕上游来游去,是不是感觉很激动,因为它很逼真,所以会让你兴奋起来,这是实现它的源代码。 -
C#制作桌面宠物
2013-03-21 17:03:23利用C#制作桌面宠物图片质量还是可观的,开发过程也相当地简单 -
桌面宠物来了!
2021-01-22 09:00:00↑点击上方“一行黑科技”关注 + 星标~每天分享,绝不错过上期神器:文字转语音神器!我竟然对着桌面玩了一个小时。1 闲聊 — 桌面宠物来了!大家好,我是懂王。我们身边有很... -
Python实现桌面宠物
2020-05-04 22:37:20基于PyQt5 import os import cfg import sys import random from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5 import QtWidgets, ...'''桌面宠物''' class Deskto... -
C#半透明桌面宠物红色金鱼源代码
2021-03-16 02:23:10内容索引:C#源码,游戏开发,桌面宠物,C#游戏源码,半透明窗体 灵感来自于一个C#编写的半透明窗体,又经过加工得来这款桌面宠物程序:一条漂亮可爱的红金鱼,简直和真的差不多,可以在你面前游来游去。 -
基于JAVA的桌面宠物
2017-03-12 21:11:09一款基于JAVA的桌面宠物,里面图片资源什么的已经有了,导入Eclipse中就可以用。中间可能还有点bug,希望下载的客官可以提出,以待改进。(有了发送邮件的功能,但好像忘记添加进去了) -
3D桌面宠物金鱼v3.5免费绿色版
2019-08-06 05:11:163D桌面宠物金鱼是一个3D的桌面宠物工具,运行程序就会有一条小金鱼游动在桌面上,鼠标点击金鱼, 金鱼就会加快游动速度,游动流畅,真实,让你的桌面更加丰富多彩。鼠标右键点击,退出程序。喜欢的朋友们赶紧下载试... -
桌面宠物羊
2007-07-14 10:04:41桌面宠物羊!在你的电脑桌面陪你一起工作! -
桌面宠物工具
2008-03-02 09:58:02这是一款桌面宠物工具,可以美化桌面,让你的女友嬉笑。。。。