python桌面宠物
2025-03-15 15:09:27
发布于:重庆
1.0:
import tkinter as tk
import random
import math
class DesktopPet:
def __init__(self, root):
self.root = root
self.root.overrideredirect(True) # 移除窗口边框
self.root.attributes('-topmost', True) # 窗口置顶
self.root.geometry('150x180+500+500') # 初始位置和大小(增加高度以容纳按钮)
self.root.config(bg='white') # 背景颜色
self.canvas = tk.Canvas(self.root, bg='white', highlightthickness=0)
self.canvas.pack(fill=tk.BOTH, expand=True)
# 绘制更可爱的小猫咪
self.face = self.canvas.create_oval(30, 30, 120, 120, fill='#FFD700', outline='black') # 脸
self.left_ear = self.canvas.create_polygon(30, 30, 50, 10, 70, 30, fill='#FFD700', outline='black') # 左耳
self.right_ear = self.canvas.create_polygon(80, 30, 100, 10, 120, 30, fill='#FFD700', outline='black') # 右耳
self.left_eye = self.canvas.create_oval(50, 60, 60, 70, fill='black') # 左眼
self.right_eye = self.canvas.create_oval(90, 60, 100, 70, fill='black') # 右眼
self.nose = self.canvas.create_polygon(70, 80, 80, 80, 75, 90, fill='pink', outline='black') # 鼻子
self.mouth = self.canvas.create_arc(70, 95, 80, 105, start=0, extent=-180, style=tk.ARC, width=2) # 嘴巴
self.whiskers = [
self.canvas.create_line(50, 85, 30, 90, width=2), # 左胡须
self.canvas.create_line(50, 90, 30, 90, width=2), # 左胡须
self.canvas.create_line(50, 95, 30, 90, width=2), # 左胡须
self.canvas.create_line(100, 85, 120, 90, width=2), # 右胡须
self.canvas.create_line(100, 90, 120, 90, width=2), # 右胡须
self.canvas.create_line(100, 95, 120, 90, width=2), # 右胡须
]
# 用于显示文字的Label
self.text_label = tk.Label(self.root, text="", bg='white', fg='black', font=('Arial', 10))
self.text_label.place(x=10, y=130) # 将文字放在宠物下方
# 添加吃饭和喝水按钮
self.button_eat = tk.Button(self.root, text="吃饭", command=self.eat)
self.button_eat.place(x=10, y=150)
self.button_drink = tk.Button(self.root, text="喝水", command=self.drink)
self.button_drink.place(x=60, y=150)
# 小猫咪的状态
self.hunger = 100 # 饥饿值
self.thirst = 100 # 口渴值
self.is_moving = False # 是否正在移动
self.is_talking = False # 是否正在说话
self.target_x, self.target_y = self.root.winfo_x(), self.root.winfo_y() # 小猫咪的目标位置
# 绑定事件
self.root.bind('<Button-1>', self.on_click) # 绑定鼠标左键点击事件
self.root.bind('<B1-Motion>', self.on_drag) # 绑定鼠标拖动事件
self.root.bind('<Button-3>', self.on_right_click) # 绑定鼠标右键点击事件
self.move_pet()
self.update_status() # 更新状态
# 创建状态窗口
self.status_window = tk.Toplevel(root)
self.status_window.overrideredirect(True) # 移除窗口边框
self.status_window.attributes('-topmost', True) # 窗口置顶
self.status_window.geometry('150x50+500+400') # 初始位置和大小
self.status_window.config(bg='white') # 背景颜色
# 状态窗口的内容
self.status_label = tk.Label(self.status_window, text="", bg='white', fg='black', font=('Arial', 10))
self.status_label.pack(fill=tk.BOTH, expand=True)
# 绑定状态窗口的拖动事件
self.status_window.bind('<Button-1>', self.on_status_window_click)
self.status_window.bind('<B1-Motion>', self.on_status_window_drag)
self.update_status_window() # 更新状态窗口
def on_click(self, event):
# 点击小猫咪时随机说话
self.say_something()
def on_drag(self, event):
deltax = event.x - self.x
deltay = event.y - self.y
x = self.root.winfo_x() + deltax
y = self.root.winfo_y() + deltay
self.root.geometry(f'+{x}+{y}')
def on_right_click(self, event):
self.root.destroy() # 右键点击关闭窗口
def on_status_window_click(self, event):
# 状态窗口的点击事件
self.status_window.x = event.x
self.status_window.y = event.y
def on_status_window_drag(self, event):
# 状态窗口的拖动事件
deltax = event.x - self.status_window.x
deltay = event.y - self.status_window.y
x = self.status_window.winfo_x() + deltax
y = self.status_window.winfo_y() + deltay
self.status_window.geometry(f'+{x}+{y}')
def move_pet(self):
# 随机移动宠物
x = random.randint(-10, 10)
y = random.randint(-10, 10)
self.root.geometry(f'+{self.root.winfo_x() + x}+{self.root.winfo_y() + y}')
self.root.after(500, self.move_pet) # 每500毫秒移动一次
def say_something(self):
if self.is_talking:
return # 如果正在说话,则不再重复
self.is_talking = True
# 随机选择一句话
phrases = [
"喵喵喵~",
"你好呀!",
"今天过得怎么样?",
"摸摸我~",
"想我了吗?",
"陪我玩吧!",
"我是你的小猫咪~",
]
phrase = random.choice(phrases)
self.text_label.config(text=phrase) # 更新文字
# 嘴巴动画
self.animate_mouth()
# 3秒后停止说话
self.root.after(3000, self.stop_talking)
def animate_mouth(self):
# 嘴巴动画:说话时嘴巴动一动
if self.is_talking:
self.canvas.delete(self.mouth)
self.mouth = self.canvas.create_arc(70, 95, 80, 105, start=0, extent=-180, style=tk.ARC, width=2)
self.root.after(200, self.reset_mouth) # 200毫秒后恢复嘴巴
def reset_mouth(self):
if self.is_talking:
self.canvas.delete(self.mouth)
self.mouth = self.canvas.create_line(70, 95, 80, 95, width=2)
self.root.after(200, self.animate_mouth) # 继续动画
def stop_talking(self):
self.is_talking = False
self.text_label.config(text="") # 清空文字
self.canvas.delete(self.mouth)
self.mouth = self.canvas.create_line(70, 95, 80, 95, width=2) # 恢复嘴巴
def move_to_target(self):
# 计算小猫咪和目标位置的距离
pet_x = self.root.winfo_x()
pet_y = self.root.winfo_y()
delta_x = self.target_x - pet_x
delta_y = self.target_y - pet_y
# 如果距离大于5像素,则继续移动
if abs(delta_x) > 5 or abs(delta_y) > 5:
step_x = delta_x / 10
step_y = delta_y / 10
self.root.geometry(f'+{int(pet_x + step_x)}+{int(pet_y + step_y)}')
self.root.after(50, self.move_to_target) # 每50毫秒移动一次
else:
self.is_moving = False
def update_status(self):
# 更新小猫咪的状态(饥饿和口渴)
self.hunger = max(0, self.hunger - 1) # 饥饿值减少
self.thirst = max(0, self.thirst - 1) # 口渴值减少
# 如果饥饿或口渴值过低,小猫咪会发出提示
if self.hunger < 30:
self.text_label.config(text="我好饿啊!")
elif self.thirst < 30:
self.text_label.config(text="我好渴啊!")
# 每2秒更新一次状态
self.root.after(2000, self.update_status)
def update_status_window(self):
# 更新状态窗口的内容
status_text = f"饥饿值: {self.hunger}\n口渴值: {self.thirst}"
self.status_label.config(text=status_text)
# 每1秒更新一次状态窗口
self.root.after(1000, self.update_status_window)
def eat(self):
# 吃饭功能
self.hunger = min(100, self.hunger + 30) # 增加饥饿值
self.text_label.config(text="真好吃!")
def drink(self):
# 喝水功能
self.thirst = min(100, self.thirst + 30) # 增加口渴值
self.text_label.config(text="真解渴!")
class Ball:
def __init__(self, root, pet):
self.root = root
self.pet = pet
self.root.overrideredirect(True) # 移除窗口边框
self.root.attributes('-topmost', True) # 窗口置顶
self.root.geometry('50x50+700+700') # 初始位置和大小
self.root.config(bg='white') # 背景颜色
self.canvas = tk.Canvas(self.root, bg='white', highlightthickness=0)
self.canvas.pack(fill=tk.BOTH, expand=True)
# 绘制球
self.ball = self.canvas.create_oval(10, 10, 40, 40, fill='blue', outline='black') # 球
self.ball_x, self.ball_y = 25, 25 # 球的中心位置
self.x = 0
self.y = 0
self.is_dragging = False # 是否正在拖动球
self.root.bind('<Button-1>', self.on_click) # 绑定鼠标左键点击事件
self.root.bind('<B1-Motion>', self.on_drag) # 绑定鼠标拖动事件
self.root.bind('<ButtonRelease-1>', self.on_release) # 绑定鼠标释放事件
def on_click(self, event):
self.is_dragging = True
self.x = event.x
self.y = event.y
def on_drag(self, event):
if self.is_dragging:
# 拖动球
deltax = event.x - self.x
deltay = event.y - self.y
self.root.geometry(f'+{self.root.winfo_x() + deltax}+{self.root.winfo_y() + deltay}')
self.x = event.x
self.y = event.y
def on_release(self, event):
self.is_dragging = False
# 球停止拖动后,设置小猫咪的目标位置
self.pet.target_x = self.root.winfo_x() + 25
self.pet.target_y = self.root.winfo_y() + 25
self.pet.move_to_target()
if __name__ == '__main__':
root_pet = tk.Tk()
pet = DesktopPet(root_pet)
root_ball = tk.Tk()
ball = Ball(root_ball, pet)
root_pet.mainloop()
root_ball.mainloop()
全部评论 3
EMM......过于抽象
2025-03-15 来自 北京
0摸他还报错是吧
2025-03-15 来自 四川
0d
2025-03-15 来自 重庆
0
有帮助,赞一个