yang
2025-04-02 13:45:35
发布于:浙江
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),
]
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)
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()
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)
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
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)
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="我好渴啊!")
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)
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()
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),
]
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)
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()
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)
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
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)
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="我好渴啊!")
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)
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()
这里空空如也
有帮助,赞一个