使用 Python构建 Windows 进程管理器应用程序

在这篇博客中,我们将探讨如何使用 wxPython 构建一个简单的 Windows 进程管理器应用程序。这个应用程序允许用户列出当前系统上的所有进程,选择和终止进程,并将特定进程保存到文件中以供将来加载。
C:\pythoncode\new\manageprocess.py

全部代码

import wx
import psutil
import os
import signalclass ProcessManager(wx.Frame):def __init__(self, parent, title):super(ProcessManager,self).__init__(parent, title=title, size=(800, 500))self.panel = wx.Panel(self)self.search_box = wx.TextCtrl(self.panel, style=wx.TE_PROCESS_ENTER)self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchProcess, self.search_box)self.btn_list_processes = wx.Button(self.panel, label='List All Processes')# Create ListView1 with a checkbox columnself.process_listview = wx.ListView(self.panel, style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES)self.process_listview.InsertColumn(0, '', width=40)  # Checkbox columnself.process_listview.InsertColumn(1, 'Process Name', width=200)self.process_listview.InsertColumn(2, 'PID', width=100)self.process_listview.InsertColumn(3, 'CPU %', width=100)self.process_listview.InsertColumn(4, 'RAM %', width=100)self.selected_listview = wx.ListView(self.panel, style=wx.LC_REPORT)self.selected_listview.InsertColumn(0, 'Process Name', width=200)self.selected_listview.InsertColumn(1, 'PID', width=100)self.btn_select_all = wx.Button(self.panel, label='Select All')self.btn_deselect_all = wx.Button(self.panel, label='Deselect All')self.btn_add_to_listview2 = wx.Button(self.panel, label='Add to ListView2')self.btn_kill_processes = wx.Button(self.panel, label='Kill Selected Processes')self.btn_kill_by_name = wx.Button(self.panel, label='Kill by Name')self.btn_save = wx.Button(self.panel, label='Save')self.btn_load = wx.Button(self.panel, label='Load')self.btn_delete_selected = wx.Button(self.panel, label='Delete Selected')# Organize layout with BoxSizersmain_sizer = wx.BoxSizer(wx.VERTICAL)search_sizer = wx.BoxSizer(wx.HORIZONTAL)listview1_sizer = wx.BoxSizer(wx.VERTICAL)button_sizer = wx.BoxSizer(wx.HORIZONTAL)listview2_sizer = wx.BoxSizer(wx.VERTICAL)search_sizer.Add(self.search_box, 1, wx.EXPAND | wx.ALL, 5)search_sizer.Add(self.btn_list_processes, 0, wx.EXPAND | wx.ALL, 5)listview1_sizer.Add(search_sizer, 0, wx.EXPAND | wx.ALL, 5)listview1_sizer.Add(self.process_listview, 1, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_select_all, 0, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_deselect_all, 0, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_add_to_listview2, 0, wx.EXPAND | wx.ALL, 5)listview1_sizer.Add(button_sizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)listview2_sizer.Add(self.selected_listview, 1, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_kill_processes, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_kill_by_name, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_save, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_load, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_delete_selected, 0, wx.EXPAND | wx.ALL, 5)main_sizer.Add(listview1_sizer, 1, wx.EXPAND | wx.ALL, 5)main_sizer.Add(listview2_sizer, 1, wx.EXPAND | wx.ALL, 5)self.panel.SetSizer(main_sizer)self.Bind(wx.EVT_BUTTON, self.OnListProcesses, self.btn_list_processes)self.Bind(wx.EVT_BUTTON, self.OnKillProcesses, self.btn_kill_processes)self.Bind(wx.EVT_BUTTON, self.OnKillProcessesByName, self.btn_kill_by_name)self.Bind(wx.EVT_BUTTON, self.OnSaveProcesses, self.btn_save)self.Bind(wx.EVT_BUTTON, self.OnLoadProcesses, self.btn_load)self.Bind(wx.EVT_BUTTON, self.OnSelectAll, self.btn_select_all)self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, self.btn_deselect_all)self.Bind(wx.EVT_BUTTON, self.OnAddToListView2, self.btn_add_to_listview2)self.Bind(wx.EVT_BUTTON, self.OnDeleteSelected, self.btn_delete_selected)self.Show()def OnListProcesses(self,event):self.process_listview.DeleteAllItems()for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):index = self.process_listview.InsertItem(self.process_listview.GetItemCount(), '')self.process_listview.SetItem(index, 1, proc.info['name'])self.process_listview.SetItem(index, 2, str(proc.info['pid']))self.process_listview.SetItem(index, 3, f"{proc.info['cpu_percent']:.1f}")self.process_listview.SetItem(index, 4, f"{proc.info['memory_percent']:.1f}")def OnSearchProcess(self,event):search_query = self.search_box.GetValue().lower()self.process_listview.DeleteAllItems()for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):if search_query in proc.info['name'].lower():index = self.process_listview.InsertItem(self.process_listview.GetItemCount(), '')self.process_listview.SetItem(index, 1, proc.info['name'])self.process_listview.SetItem(index, 2, str(proc.info['pid']))self.process_listview.SetItem(index, 3, f"{proc.info['cpu_percent']:.1f}")self.process_listview.SetItem(index, 4, f"{proc.info['memory_percent']:.1f}")def OnKillProcesses(self,event):count = self.process_listview.GetItemCount()for i in range(count):if self.process_listview.GetItemState(i, wx.LIST_STATE_SELECTED):pid = int(self.process_listview.GetItemText(i, 2))try:os.kill(pid, signal.SIGTERM)except Exception as e:wx.MessageBox(f"Error killing process {pid}: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)self.OnListProcesses(event)def OnKillProcessesByName(self,event):process_names = [self.selected_listview.GetItemText(i) for i in range(self.selected_listview.GetItemCount())]for proc in psutil.process_iter(['name', 'pid']):if proc.info['name'] in process_names:try:os.kill(proc.info['pid'], signal.SIGTERM)except Exception as e:wx.MessageBox(f"Error killing process {proc.info['pid']}: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)def OnSaveProcesses(self,event):with open("processes.txt","w") as file:count = self.selected_listview.GetItemCount()for i in range(count):process_name = self.selected_listview.GetItemText(i)process_pid = self.selected_listview.GetItemText(i, 1)file.write(f"{process_name},{process_pid}\n")def OnLoadProcesses(self,event):self.selected_listview.DeleteAllItems()if os.path.exists("processes.txt"):with open("processes.txt","r") as file:for line in file:process_name, process_pid = line.strip().split(',')index = self.selected_listview.InsertItem(self.selected_listview.GetItemCount(), process_name)self.selected_listview.SetItem(index, 1, process_pid)def OnSelectAll(self,event): count = self.process_listview.GetItemCount()for i in range(count):self.process_listview.SetItemState(i, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)def OnDeselectAll(self,event):count = self.process_listview.GetItemCount()for i in range(count):self.process_listview.SetItemState(i, 0, wx.LIST_STATE_SELECTED)def OnAddToListView2(self,event):count = self.process_listview.GetItemCount()for i in range(count):if self.process_listview.GetItemState(i, wx.LIST_STATE_SELECTED):process_name = self.process_listview.GetItemText(i, 1)process_pid = self.process_listview.GetItemText(i, 2)index = self.selected_listview.InsertItem(self.selected_listview.GetItemCount(), process_name)self.selected_listview.SetItem(index, 1, process_pid)def OnDeleteSelected(self,event):count = self.selected_listview.GetItemCount()for i in range(count - 1, -1, -1):if self.selected_listview.GetItemState(i, wx.LIST_STATE_SELECTED):self.selected_listview.DeleteItem(i)if __name__ == "__main__":app = wx.App(False)frame = ProcessManager(None, "Process Manager")app.MainLoop()

项目概述

我们的目标是构建一个图形用户界面 (GUI) 应用程序,主要功能包括:

  1. 列出所有进程:列出当前系统上的所有进程,并显示进程名、PID、CPU 和内存占用情况。
  2. 搜索进程:通过输入框搜索指定进程名称,并显示匹配结果。
  3. 选择和终止进程:通过复选框选择多个进程并终止它们。
  4. 保存和加载进程列表:将选定的进程保存到文本文件中,并从文件加载这些进程。
  5. 进程管理:添加功能来按名称终止进程,并从列表中删除选中的项。

准备工作

在开始之前,确保你已经安装了 Python 和 wxPython。你可以通过以下命令安装 wxPython:

pip install wxPython

构建应用程序

下面是我们将要实现的完整代码。你可以直接复制到你的 IDE 中并运行。

import wx
import psutil
import os
import signalclass ProcessManager(wx.Frame):def __init__(self, parent, title):super(ProcessManager, self).__init__(parent, title=title, size=(800, 500))self.panel = wx.Panel(self)# 搜索框self.search_box = wx.TextCtrl(self.panel, style=wx.TE_PROCESS_ENTER)self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchProcess, self.search_box)# 列出所有进程按钮self.btn_list_processes = wx.Button(self.panel, label='List All Processes')# 创建 ListView1 并添加复选框列self.process_listview = wx.ListView(self.panel, style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES)self.process_listview.InsertColumn(0, '', width=40)  # 复选框列self.process_listview.InsertColumn(1, 'Process Name', width=200)self.process_listview.InsertColumn(2, 'PID', width=100)self.process_listview.InsertColumn(3, 'CPU %', width=100)self.process_listview.InsertColumn(4, 'RAM %', width=100)self.selected_listview = wx.ListView(self.panel, style=wx.LC_REPORT)self.selected_listview.InsertColumn(0, 'Process Name', width=200)self.selected_listview.InsertColumn(1, 'PID', width=100)# 各种功能按钮self.btn_select_all = wx.Button(self.panel, label='Select All')self.btn_deselect_all = wx.Button(self.panel, label='Deselect All')self.btn_add_to_listview2 = wx.Button(self.panel, label='Add to ListView2')self.btn_kill_processes = wx.Button(self.panel, label='Kill Selected Processes')self.btn_kill_by_name = wx.Button(self.panel, label='Kill by Name')self.btn_save = wx.Button(self.panel, label='Save')self.btn_load = wx.Button(self.panel, label='Load')self.btn_delete_selected = wx.Button(self.panel, label='Delete Selected')# 使用 BoxSizers 组织布局main_sizer = wx.BoxSizer(wx.VERTICAL)search_sizer = wx.BoxSizer(wx.HORIZONTAL)listview1_sizer = wx.BoxSizer(wx.VERTICAL)button_sizer = wx.BoxSizer(wx.HORIZONTAL)listview2_sizer = wx.BoxSizer(wx.VERTICAL)# 将搜索框和按钮添加到布局中search_sizer.Add(self.search_box, 1, wx.EXPAND | wx.ALL, 5)search_sizer.Add(self.btn_list_processes, 0, wx.EXPAND | wx.ALL, 5)# 将 ListView1 和按钮添加到布局中listview1_sizer.Add(search_sizer, 0, wx.EXPAND | wx.ALL, 5)listview1_sizer.Add(self.process_listview, 1, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_select_all, 0, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_deselect_all, 0, wx.EXPAND | wx.ALL, 5)button_sizer.Add(self.btn_add_to_listview2, 0, wx.EXPAND | wx.ALL, 5)listview1_sizer.Add(button_sizer, 0, wx.ALIGN_CENTER | wx.ALL, 5)# 将 ListView2 和其他按钮添加到布局中listview2_sizer.Add(self.selected_listview, 1, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_kill_processes, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_kill_by_name, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_save, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_load, 0, wx.EXPAND | wx.ALL, 5)listview2_sizer.Add(self.btn_delete_selected, 0, wx.EXPAND | wx.ALL, 5)main_sizer.Add(listview1_sizer, 1, wx.EXPAND | wx.ALL, 5)main_sizer.Add(listview2_sizer, 1, wx.EXPAND | wx.ALL, 5)self.panel.SetSizer(main_sizer)# 绑定事件处理self.Bind(wx.EVT_BUTTON, self.OnListProcesses, self.btn_list_processes)self.Bind(wx.EVT_BUTTON, self.OnKillProcesses, self.btn_kill_processes)self.Bind(wx.EVT_BUTTON, self.OnKillProcessesByName, self.btn_kill_by_name)self.Bind(wx.EVT_BUTTON, self.OnSaveProcesses, self.btn_save)self.Bind(wx.EVT_BUTTON, self.OnLoadProcesses, self.btn_load)self.Bind(wx.EVT_BUTTON, self.OnSelectAll, self.btn_select_all)self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, self.btn_deselect_all)self.Bind(wx.EVT_BUTTON, self.OnAddToListView2, self.btn_add_to_listview2)self.Bind(wx.EVT_BUTTON, self.OnDeleteSelected, self.btn_delete_selected)self.Show()def OnListProcesses(self, event):self.process_listview.DeleteAllItems()for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):index = self.process_listview.InsertItem(self.process_listview.GetItemCount(), '')self.process_listview.SetItem(index, 1, proc.info['name'])self.process_listview.SetItem(index, 2, str(proc.info['pid']))self.process_listview.SetItem(index, 3, f"{proc.info['cpu_percent']:.1f}")self.process_listview.SetItem(index, 4, f"{proc.info['memory_percent']:.1f}")def OnSearchProcess(self, event):search_query = self.search_box.GetValue().lower()self.process_listview.DeleteAllItems()for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):if search_query in proc.info['name'].lower():index = self.process_listview.InsertItem(self.process_listview.GetItemCount(), '')self.process_listview.SetItem(index, 1, proc.info['name'])self.process_listview.SetItem(index, 2, str(proc.info['pid']))self.process_listview.SetItem(index, 3, f"{proc.info['cpu_percent']:.1f}")self.process_listview.SetItem(index, 4, f"{proc.info['memory_percent']:.1f}")def OnKillProcesses(self, event):count = self.process_listview.GetItemCount()for i in range(count):if self.process_listview.GetItemState(i, wx.LIST_STATE_SELECTED):pid = int(self.process_listview.GetItemText(i, 2))try:os.kill(pid, signal.SIGTERM)except Exception as e:wx.MessageBox(f"Error killing process {pid}: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)self.OnListProcesses(event)def OnKillProcessesByName(self, event):process_names = [self.selected_listview.GetItemText(i) for i in range(self.selected_listview.GetItemCount())]for proc in psutil.process_iter(['name', 'pid']):if proc.info['name'] in process_names:try:os.kill(proc.info['pid'], signal.SIGTERM)except Exception as e:wx.MessageBox(f"Error killing process {proc.info['pid']}: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)def OnSaveProcesses(self, event):with open('saved_processes.txt', 'w') as f:for i in range(self.selected_listview.GetItemCount()):process_name = self.selected_listview.GetItemText(i)process_pid = self.selected_listview.GetItemText(i, 1)f.write(f"{process_name},{process_pid}\n")def OnLoadProcesses(self, event):self.selected_listview.DeleteAllItems()try:with open('saved_processes.txt', 'r') as f:for line in f.readlines():process_name, process_pid = line.strip().split(',')index = self.selected_listview.InsertItem(self.selected_listview.GetItemCount(), process_name)self.selected_listview.SetItem(index, 1, process_pid)except FileNotFoundError:wx.MessageBox("No saved processes found.", "Error", wx.OK | wx.ICON_ERROR)def OnSelectAll(self, event):count = self.process_listview.GetItemCount()for i in range(count):self.process_listview.CheckItem(i)def OnDeselectAll(self, event):count = self.process_listview.GetItemCount()for i in range(count):self.process_listview.CheckItem(i, False)def OnAddToListView2(self, event):count = self.process_listview.GetItemCount()for i in range(count):if self.process_listview.IsItemChecked(i):process_name = self.process_listview.GetItemText(i, 1)process_pid = self.process_listview.GetItemText(i, 2)index = self.selected_listview.InsertItem(self.selected_listview.GetItemCount(), process_name)self.selected_listview.SetItem(index, 1, process_pid)def OnDeleteSelected(self, event):count = self.selected_listview.GetItemCount()for i in range(count - 1, -1, -1):if self.selected_listview.GetItemState(i, wx.LIST_STATE_SELECTED):self.selected_listview.DeleteItem(i)if __name__ == "__main__":app = wx.App(False)frame = ProcessManager(None, "Process Manager")app.MainLoop()

代码解释

1. 初始化界面

ProcessManager 类的 __init__ 方法中,我们设置了窗口的基本布局,并添加了所有必要的控件,包括 ListView、按钮和搜索框。我们还绑定了所有按钮的事件处理方法。

2. 列出所有进程

OnListProcesses 方法中,我们使用 psutil.process_iter 获取所有正在运行的进程,并将它们显示在 ListView1 中。我们显示了进程名称、PID、CPU 使用率和内存使用率。

3. 搜索进程

OnSearchProcess 方法通过搜索框输入的内容进行过滤,并在 ListView1 中显示匹配的进程。

4. 选择和终止进程

我们可以使用复选框选择一个或多个进程,并通过 OnKillProcessesOnKillProcessesByName 方法终止它们。

5. 保存和加载进程列表

OnSaveProcesses 方法将选中的进程保存到一个文本文件中,而 OnLoadProcesses 方法则从文件加载这些进程并显示在 ListView2 中。

6. 全选和全不选

通过 OnSelectAllOnDeselectAll 方法,我们可以选择或取消选择 ListView1 中的所有项。

效果如下

在这里插入图片描述

总结

这个小型的进程管理器应用程序展示了如何使用 wxPython 构建一个功能强大的桌面应用。通过整合 psutil 和 wxPython,我们可以轻松地管理和监控系统进程,为用户提供了便捷的工具。

你可以进一步扩展这个应用程序,例如添加更多的进程管理功能,或者优化界面布局和用户体验。希望这篇博客对你有所帮助,并激发你在 Python 开发中的更多创意!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406510.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普元EOS-数据实体运行时动态增加property

1 前言 在Java开发读取数据的时候,一般都采用ORM方式将数据表的字段映射到实体对象中。 数据表中有一个字段,实体对象就有一个字段。 但很多时候,我们在读取的数据和显示的数据不同,比如,读取的是部门id&#xff0c…

探索数据结构:图(一)之邻接矩阵与邻接表

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 图的定义 **图(Graph)**是数学和计算机科学中…

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐)

主播说联播 | 从“十分之三”到“悟空”,国潮有何出圈密码? 《黑神话:悟空》里的中国古建取景地,在这里! 这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) 原创 IPBrain平台君 集成电路大数据平台 2024年08月22日 17:28 …

gif图片怎么压缩大小?深度测评7款动图压缩工具(内含教程)

gif图片在社交媒体和网络上非常流行,深受大家喜爱,因为它可以呈现生动的动画效果。gif动图之所以受到欢迎,主要因为其出色的压缩算法,能有效存储多个帧,从而实现流畅的动画。 然而,大多数社交媒体平台对gi…

[数据集][目标检测]集装箱缺陷检测数据集VOC+YOLO格式4127张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4127 标注数量(xml文件个数):4127 标注数量(txt文件个数):4127 标注…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了,今天微软发布 Windows 11 Canary 新版本,此次版本号已经转移到 Build 27xxx,首发版本为 Build 27686 版。 此次更新带来了多项改进,包括 Windows Sandbox 沙盒功能切换到 Microsof…

关于智能编码助手【通义灵码】,开发者们这么说...

自通义灵码发布以来,不停地有开发者朋友为我们送上通义灵码的测评反馈。 关于通义灵码,开发者这样说 墨问西东 CEO 池建强&墨问研发团队 “通义灵码有一个强大的功能就是企业知识库检索增强,我们只需要上传团队的代码规范,…

[数据集][目标检测]快递包裹检测数据集VOC+YOLO格式5382张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5382 标注数量(xml文件个数):5382 标注数量(txt文件个数):5382 标注…

【C语言小项目】五子棋游戏

目录 前言 一、游戏规则 1.功能分析 2.玩法分析 3.胜负判定条件 二、游戏实现思路 三、代码实现与函数封装 1.项目文件创建 2.头文件说明 3.函数封装 1)菜单实现 2)进度条实现 3)main函数实现 4)Game函数 5&#xff0…

TIM输出比较之PWM驱动LED呼吸灯应用案例

文章目录 前言一、应用案例演示二、电路接线图三、应用案例代码四、应用案例分析4.1 基本思路4.2 相关库函数介绍4.3 初始化PWM模块4.3.1 RCC开启时钟4.3.2 配置时基单元4.3.3 配置输出比较单元4.3.4 配置GPIO4.3.5 运行控制 4.4 PWM输出模块4.5 主程序 前言 提示:…

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2953 标注数量(xml文件个数):2953 标注数量(txt文件个数):2953 标注…

电脑录屏高清视频制作:如何选择适合的分辨率和参数

在当今数字化时代,无论是教学、演示还是游戏直播,电脑录屏已经成为了一个不可或缺的工具。然而画质往往是录屏质量的关键因素,许多用户在追求高清录屏体验时,常常面临选择1080p还是4K分辨率的困惑。本文将深入探讨如何优化电脑录屏…

SpringBoot自动配置

一、Condition条件判断功能 Condition 是在Spring 4.0 增加的条件判断功能,其主要作用是判断条件是否满足,从而决定是否初始化并向容器注入Bean对象。通过Conditional注解及其一系列的其他相关注解实现。 在Spring Boot中,条件匹配&#xf…

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓…

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…

微软的免费“后悔药“-Windows File Recovery (WinFR)

微软的免费"后悔药"-Windows File Recovery (WinFR) 当你不小心误删除了文件或因各种意外情况导致数据丢失,可以使用 EasyRecovery、Disk Drill、DiskGenius、Recuva 等“上古”软件,也可以交由专业机构进行恢复。微软(Microsoft&…

揭秘!移动安全管理系统是什么?有什么功能?(从小白到精通一文揭晓!)

在2024年,移动终端管控软件在企业和组织中的应用日益广泛。 移动安全管理系统不仅提高了管理效率,还增强了数据安全性和移动办公的便捷性。 以下是六款值得推荐的移动终端管控软件: 1. 安企神 特点:作为行业领头羊,…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架:Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言(QVD-2022-46174)介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

(26)微信检查联系人和清粉(针对删除和拉黑)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

UI自动化测试:遍历页面元素并获取文本的实践分享!

遍历读取元素的文本 在写UI自动化过程中还会遇到需要遍历读取元素的情况。下面分享以「稿定设计」网站为例,想要通过UI自动化读取素材内容的操作菜单列表,如下图: 代码片段和解释 # 获取菜单列表元素的文本信息,例如&#xff1a…