21.05.2022
статья
Создание простого Desktop питомца на Python

Приветствую, это Дима!
Я расскажу как сделать своего Desktop питомца.
Коротко о Desktop питомцах, это виртуальные питомцы у вас на экране ПК.
И так... Начнем с импортирования:

import random
import tkinter as tk

Рандом нужен для действий питомца, а tkinter поможет в остальном.
Для начала заведём несколько переменных:

x = 1400
cycle = 0
check = 1
idle_num =[1,2,3,4]
sleep_num = [10,11,12,13,15]
walk_left = [6,7]
walk_right = [8,9]
event_number = random.randrange(1,3,1)
impath = 'C:\\Укажите\\тут\\путь\\в папку\\с картинками\\'

Далее делаем передачу случайного номера к событию:

def event(cycle,check,event_number,x):
    if event_number in idle_num:
      check = 0
      print('idle анимация')
      window.after(400,update,cycle,check,event_number,x)#номера 1,2,3,4 = idle анимация
    elif event_number == 5:
      check = 1
      print('С idle анимации в спящую')
      window.after(100,update,cycle,check,event_number,x) #номер 5 = с idle анимации в спящую
    elif event_number in walk_left:
      check = 4
      print('Идет налево')
      window.after(100,update,cycle,check,event_number,x)#номера 6,7 = идет налево
    elif event_number in walk_right:
      check = 5
      print('Идет направо')
      window.after(100,update,cycle,check,event_number,x)#номера 8,9 = идет направо
    elif event_number in sleep_num:
      check  = 2
      print('Спит')
      window.after(1000,update,cycle,check,event_number,x)#номера 10,11,12,13,15 = спит
    elif event_number == 14:
      check = 3
      print('Со спящей в idle анимацию')
      window.after(100,update,cycle,check,event_number,x)#номер 15 = со спящей в idle анимацию

Print можете убрать (он для удобства).
Заставляем gif работать:

def gif_work(cycle,frames,event_number,first_num,last_num):
	if cycle < len(frames) -1:
    	cycle =1
    else:
    	cycle = 0
        event_number = random.randrange(first_num,last_num 1,1) 
        return cycle,event_number
def update(cycle,check,event_number,x):
#idle
    if check ==0:
        frame = idle[cycle]
        cycle ,event_number = gif_work(cycle,idle,event_number,1,9)
#С idle в спящую 
    elif check ==1:
        frame = idle_to_sleep[cycle]
        cycle ,event_number = gif_work(cycle,idle_to_sleep,event_number,10,10)
#спящая 
    elif check == 2:
        frame = sleep[cycle]
        cycle ,event_number = gif_work(cycle,sleep,event_number,10,15)
#Со спящей в idle 
    elif check ==3:
        frame = sleep_to_idle[cycle]
        cycle ,event_number = gif_work(cycle,sleep_to_idle,event_number,1,1)
#Ходьба налево 
    elif check == 4:
        frame = walk_positive[cycle]
        cycle , event_number = gif_work(cycle,walk_positive,event_number,1,9)
        x -= 3
#Ходьба направо 
    elif check == 5:
        frame = walk_negative[cycle]
        cycle , event_number = gif_work(cycle,walk_negative,event_number,1,9)
        x -= 3
    window.geometry('100x100 ' str(x) ' 1050')
    label.configure(image=frame)
    window.after(1,event,cycle,check,event_number,x)
window = tk.Tk()

Действия по вызову gif (если вы ставите свои, то замените названия гифок в коде на названия ваших гифок):

idle = [tk.PhotoImage(file=impath 'idle.gif',format = 'gif -index %i' %(i)) for i in range(5)]#idle gif
idle_to_sleep = [tk.PhotoImage(file=impath 'idle_to_sleep.gif',format = 'gif -index %i' %(i)) for i in range(8)]#с idle в спящую gif
sleep = [tk.PhotoImage(file=impath 'sleep.gif',format = 'gif -index %i' %(i)) for i in range(3)]#спящая gif
sleep_to_idle = [tk.PhotoImage(file=impath 'sleep_to_idle.gif',format = 'gif -index %i' %(i)) for i in range(8)]#со спящей в idle gif
walk_positive = [tk.PhotoImage(file=impath 'walking_positive.gif',format = 'gif -index %i' %(i)) for i in range(8)]#идёт на лево gif
walk_negative = [tk.PhotoImage(file=impath 'walking_negative.gif',format = 'gif -index %i' %(i)) for i in range(8)]#идёт на право gif

Конфигурация окна:

window.config(highlightbackground='black')
label = tk.Label(window,bd=0,bg='black')
window.overrideredirect(True)
window.wm_attributes('-transparentcolor','black')
label.pack()

Цикл выполнения программы:

window.after(1,update,cycle,check,event_number,x)
window.mainloop()

Полный код:

import random
import tkinter as tk
x = 1400
cycle = 0
check = 1
idle_num =[1,2,3,4]
sleep_num = [10,11,12,13,15]
walk_left = [6,7]
walk_right = [8,9]
event_number = random.randrange(1,3,1)
impath = 'C:\\Укажите\\тут\\путь\\в папку\\с картинками\\'
#передача случайного номера к событию
def event(cycle,check,event_number,x):
    if event_number in idle_num:
      check = 0
      print('idle анимация')
      window.after(400,update,cycle,check,event_number,x)#номера 1,2,3,4 = idle анимация
    elif event_number == 5:
      check = 1
      print('С idle анимации в спящую')
      window.after(100,update,cycle,check,event_number,x) #номер 5 = с idle анимации в спящую
    elif event_number in walk_left:
      check = 4
      print('Идет налево')
      window.after(100,update,cycle,check,event_number,x)#номера 6,7 = идет налево
    elif event_number in walk_right:
      check = 5
      print('Тдет направо')
      window.after(100,update,cycle,check,event_number,x)#номера 8,9 = идет направо
    elif event_number in sleep_num:
      check  = 2
      print('Спит')
      window.after(1000,update,cycle,check,event_number,x)#номера 10,11,12,13,15 = спит
    elif event_number == 14:
      check = 3
      print('Со спящей в idle анимацию')
      window.after(100,update,cycle,check,event_number,x)#номер 15 = со спящей в idle анимацию
#заставляем gif работать
def gif_work(cycle,frames,event_number,first_num,last_num):
 if cycle < len(frames) -1:
  cycle =1
 else:
  cycle = 0
  event_number = random.randrange(first_num,last_num 1,1)
 return cycle,event_number
def update(cycle,check,event_number,x):
#idle
 if check ==0:
  frame = idle[cycle]
  cycle ,event_number = gif_work(cycle,idle,event_number,1,9)
#С idle в спящую
 elif check ==1:
  frame = idle_to_sleep[cycle]
  cycle ,event_number = gif_work(cycle,idle_to_sleep,event_number,10,10)
#спящая
 elif check == 2:
  frame = sleep[cycle]
  cycle ,event_number = gif_work(cycle,sleep,event_number,10,15)
#Со спящей в idle
 elif check ==3:
  frame = sleep_to_idle[cycle]
  cycle ,event_number = gif_work(cycle,sleep_to_idle,event_number,1,1)
#Ходьба налево
 elif check == 4:
  frame = walk_positive[cycle]
  cycle , event_number = gif_work(cycle,walk_positive,event_number,1,9)
  x -= 3
#Ходьба направо
 elif check == 5:
  frame = walk_negative[cycle]
  cycle , event_number = gif_work(cycle,walk_negative,event_number,1,9)
  x -= -3
 window.geometry('100x100 ' str(x) ' 1050')
 label.configure(image=frame)
 window.after(1,event,cycle,check,event_number,x)
window = tk.Tk()
#действие по вызову gif
idle = [tk.PhotoImage(file=impath 'idle.gif',format = 'gif -index %i' %(i)) for i in range(5)]#idle gif
idle_to_sleep = [tk.PhotoImage(file=impath 'idle_to_sleep.gif',format = 'gif -index %i' %(i)) for i in range(8)]#с idle в спящую gif
sleep = [tk.PhotoImage(file=impath 'sleep.gif',format = 'gif -index %i' %(i)) for i in range(3)]#спящая gif
sleep_to_idle = [tk.PhotoImage(file=impath 'sleep_to_idle.gif',format = 'gif -index %i' %(i)) for i in range(8)]#со спящей в idle gif
walk_positive = [tk.PhotoImage(file=impath 'walking_positive.gif',format = 'gif -index %i' %(i)) for i in range(8)]#идёт на лево gif
walk_negative = [tk.PhotoImage(file=impath 'walking_negative.gif',format = 'gif -index %i' %(i)) for i in range(8)]#идёт на право gif
#Конфигурация окна
window.config(highlightbackground='black')
label = tk.Label(window,bd=0,bg='black')
window.overrideredirect(True)
window.wm_attributes('-transparentcolor','black')
label.pack()
#Цикл выполнения программы
window.after(1,update,cycle,check,event_number,x)
window.mainloop()

В качестве gif можно использовать: гифки по ссылке

Не советую вдаваться в подробности =)

Спасибо за внимание! Поддержите лайком!
Итог:
(Это на рабочем столе)

Создание простого Desktop питомца на Python
Комментарии (3)
Можешь кинуть готовую программу?
Ответ на этот комментарий
2 июня, 2022 в 20:11
|
Владислав Н. VladislavNilov
Можешь кинуть готовую программу?
Я удалил код и спрайты 😅