精华内容
下载资源
问答
  • 桌面 宠物

    2006-02-23 09:05:59
    利用微软的Agent技术,初步实现桌面宠物
  • C#桌面宠物

    2019-04-19 19:24:33
    C#桌面宠物,动态,相关代码及实现开发环境为。net2010
  • c# 桌面宠物

    2015-07-27 08:04:32
    c# 桌面宠物,类似QQ宠物,源代码 有喂食其他特效,桌面宠物源代码
  • vb做的桌面宠物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();
    

    然后我们就会得到一只会动的桌宠,如果你想按左键才能动可以添加监听器等
    效果如下
    在这里插入图片描述

    这些大家都可以改,我学的不是很好,希望可以被大佬指教出来问题
    完。

    展开全文
  • 原文链接网页链接​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,大功告成了~完整源代码详见相关文件。

    相关文件

    展开全文
  • 桌面宠物,c# WinForm编写的一个桌面宠物小游戏。
  • 桌面宠物.zip——

    2020-03-15 20:56:13
    一个桌面宠物,网上看到的,以前好像用过,但是不想折腾了,桌面就这样吧,随便看看——————————————
  • 轻音少女的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脚本项目源码-桌面宠物
  • 导语前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~废话不多说,让我们愉快地开始吧~开发工具...

    导语

    前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~

    废话不多说,让我们愉快地开始吧~

    开发工具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,大功告成了~完整源代码详见相关文件。

    相关文件

    展开全文
  • 桌面宠物大合集更多精彩,欢迎来我的论坛逛逛! 快乐论坛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,...
  • 简单的一个uniy桌面宠物demo,还有lol暴走萝莉的几款皮肤+模型+动作
  • 易语言桌面宠物游戏源码,桌面宠物游戏,写配置文件,读配置文件,图片选择,选择种类,确定种类,宠物孵化,初始化,显示信息,随机获得宝石,标签显示,体力检测,随机怪物,显示PK信息,我方信息,怪物信息,怪物回合,显示购物信息...
  • 易语言桌面宠物0.1源码,桌面宠物0.1,写配置文件,读配置文件,图片选择,选择种类,确定种类,宠物孵化,初始化,显示信息,随机获得宝石,标签显示,体力检测,随机怪物,显示PK信息,我方信息,怪物信息,怪物回合,显示购物信息,...
  • 内容索引: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#源码,游戏开发,桌面宠物,C#游戏源码,半透明窗体 灵感来自于一个C#编写的半透明窗体,又经过加工得来这款桌面宠物程序:一条漂亮可爱的红金鱼,简直和真的差不多,可以在你面前游来游去。
  • 基于JAVA的桌面宠物

    2017-03-12 21:11:09
    一款基于JAVA的桌面宠物,里面图片资源什么的已经有了,导入Eclipse中就可以用。中间可能还有点bug,希望下载的客官可以提出,以待改进。(有了发送邮件的功能,但好像忘记添加进去了)
  • 3D桌面宠物金鱼是一个3D的桌面宠物工具,运行程序就会有一条小金鱼游动在桌面上,鼠标点击金鱼, 金鱼就会加快游动速度,游动流畅,真实,让你的桌面更加丰富多彩。鼠标右键点击,退出程序。喜欢的朋友们赶紧下载试...
  • 桌面宠物

    2007-07-14 10:04:41
    桌面宠物羊!在你的电脑桌面陪你一起工作!
  • 桌面宠物工具

    2008-03-02 09:58:02
    这是一款桌面宠物工具,可以美化桌面,让你的女友嬉笑。。。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443
精华内容 177
关键字:

桌面宠物