运行环境

PyCharm 2023.2.1

python3.11

具体内容

源代码

import tkinter as tkfrom tkinter import messageboximport threadingclass PopupGenerator:def __init__(self):self.root = tk.Tk()self.root.geometry("200x120")self.root.title("无限弹窗")self.root.protocol("WM_DELETE_WINDOW", lambda: None)# 用户不可关闭弹窗一self.common_style = {"font": ("华文新魏", 14)}self.label = tk.Label(self.root, text="恭喜你打开了这个程序", **self.common_style, fg="red")self.label.pack(pady=20)self.close_program_button = tk.Button(self.root, text="关闭程序", command=self.try_detox, **self.common_style,bg="green", fg="white")self.close_program_button.pack(pady=10)self.popup_count = 0self.detox_attempts = 0self.popup_positions = []# 存储已存在弹窗的位置信息self.generate_popup()def generate_popup(self):if self.popup_count < 20:popup = tk.Toplevel(self.root)popup.title("无限弹窗")popup.geometry("200x120")# 检查已存在弹窗的位置,设置新弹窗的位置x, y = self.calculate_popup_position(popup.winfo_reqwidth(), popup.winfo_reqheight())popup.geometry(f"+{x}+{y}")popup_label = tk.Label(popup, text="多试一下", fg="blue", **self.common_style)popup_label.pack(pady=20)popup.protocol("WM_DELETE_WINDOW", self.on_popup_close)self.popup_count += 1threading.Timer(1, self.generate_popup).start()def calculate_popup_position(self, width, height):# 计算新弹窗的位置,避免重叠x_offset, y_offset = 25, 25x = self.root.winfo_x() + x_offset + len(self.popup_positions) * x_offsety = self.root.winfo_y() + y_offset + len(self.popup_positions) * y_offset# 存储新弹窗的位置信息self.popup_positions.append((x, y))return x, ydef on_popup_close(self):self.generate_additional_popup()def generate_additional_popup(self):additional_popup = tk.Toplevel(self.root)additional_popup.title("无限弹窗")additional_popup.geometry("200x120")# 检查已存在弹窗的位置,设置新弹窗的位置x, y = self.calculate_popup_position(additional_popup.winfo_reqwidth(), additional_popup.winfo_reqheight())additional_popup.geometry(f"+{x}+{y}")additional_popup_label = tk.Label(additional_popup, text="并没有用", fg="purple", **self.common_style)additional_popup_label.pack(pady=20)def try_detox(self):self.detox_attempts += 1if self.detox_attempts <= 10:messagebox.showinfo("温馨提示", f"你不会觉得点了 {self.detox_attempts} 次就有用吧")else:messagebox.showinfo("没想到啊", f"你居然坚持点了 {self.detox_attempts}次")self.root.destroy()if __name__ == "__main__":popup_generator = PopupGenerator()popup_generator.root.mainloop()

运行结果如图

点击运行时

点击关闭程序按钮(未点击足够次数)

点击关闭程序按钮(点击次数足够)

关闭多试一下弹窗(仅并没有用弹窗可关闭)

关闭程序的方法

1、任务管理器结束任务

2、点击足够次数的关闭程序

注意事项

1、没有什么技术含量,仅娱乐使用