当前位置: 首页 > news >正文

石门县建设局网站wordpress切换div组件

石门县建设局网站,wordpress切换div组件,网站建设费分录,用python 做网站Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图#xff08;Item View#xff09; 快速弄懂Pyqt5的4种项目部件#xff08;Item Widget#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器Item View 快速弄懂Pyqt5的4种项目部件Item Widget 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器Containers 快速掌握Pyqt5的20种输入控件Input Widgets 快速掌握Pyqt5的9种显示控件 详细学习Pyqt5中的5种布局方式 详细学习Pyqt5中的6种按钮 详细学习Pyqt5中的2种弹簧 详细学习Pyqt5的5种项目视图Item View 详细学习Pyqt5的4种项目部件Item Widget 详细学习Pyqt5的20种输入控件Input Widgets 详细学习Pyqt5的9种显示控件 详细学习Pyqt5的10种容器Containers 详细学习PyQt5与数据库交互 详细学习PyQt5中的多线程 快速学习PyQt5的动画和图形效果 快速学习PyQt5的高级自定义控件 快速学会绘制Pyqt5中的所有图上 快速学会绘制Pyqt5中的所有图下 待续。。。 项目软件最终效果图 第一部分项目概述 本项目的目标是创建一个简单而直观的待办事项列表应用程序。这个应用程序可以帮助用户有效地管理他们的日常任务提供以下关键功能 添加任务允许用户输入并添加新任务到待办事项列表中。删除任务提供选项以从列表中删除不再需要的任务。编辑任务让用户能够修改现有任务的描述。搜索和过滤使用户能够通过关键词搜索任务便于快速找到特定任务。进度跟踪通过进度条展示任务完成的总体进度帮助用户了解他们完成任务的情况。 应用程序的用户界面UI设计注重简洁性和易用性以确保用户能够轻松地进行日常任务管理。界面包括 任务输入框用于输入新任务的文本区域。控制按钮包括添加、删除和编辑任务的操作按钮。任务显示区展示任务列表每个任务项包含一个复选框和任务描述。搜索框允许用户输入关键词以过滤任务列表。进度指示器动态显示完成的任务占总任务的百分比。 第二部分环境搭建 准备PyQt5图形库 打开命令提示符或终端并运行以下命令pip install PyQt5这个命令会从Python包索引(PyPI)下载并安装PyQt5及其依赖项。 第三部分基础知识讲解 1. QApplication 对象 每个PyQt5应用程序的核心是QApplication对象。这个对象负责管理GUI应用程序的控制流和主要设置。在任何PyQt5程序中QApplication对象是必须的。 app QApplication([])这段代码创建了一个QApplication实例它是我们待办事项列表应用程序的起点。 2. QMainWindow 和 QWidget QMainWindow 是主窗口类为应用程序提供了一个带有菜单栏、工具栏、状态栏和中心部件的框架。在我们的项目中TodoList类继承自QMainWindow。 class TodoList(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(待办事项列表)self.setGeometry(300, 300, 600, 500)self.setWindowIcon(QIcon(icon.png))QWidget 是所有用户界面对象的基类。在这里我们创建了一个QWidget作为中心部件并在其上布置其他控件。 central_widget QWidget(self) self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget)3. 布局管理 布局管理器如QHBoxLayout和QVBoxLayout是用来在窗口中组织控件的工具。在我们的项目中我们使用了QVBoxLayout来垂直排列控件并使用了QHBoxLayout来水平排列按钮。 layout QVBoxLayout(central_widget) buttons_layout QHBoxLayout()4. 控件和事件处理 在PyQt5中控件是用户与应用程序交互的元素。我们的项目使用了多种控件例如QLineEdit来输入任务QPushButton来添加、删除和编辑任务。 self.task_input QLineEdit(self) add_button QPushButton(添加任务, self) delete_button QPushButton(删除任务, self)这些按钮通过点击事件触发相应的函数如add_task、delete_task。 5. 自定义控件 - MovingTextProgressBar 在PyQt5中我们还可以自定义控件。在此项目中我们定义了MovingTextProgressBar这是QProgressBar的一个子类用来显示任务的完成进度。 class MovingTextProgressBar(QProgressBar):def __init__(self, parentNone):super().__init__(parent)def paintEvent(self, event):# Custom painting code here这个自定义进度条在进度变化时显示百分比并根据进度动态调整文本位置。 6. 数据存储和加载 最后我们的项目还涉及到数据的保存和加载。使用Python的json模块我们可以将任务列表保存到一个文件并在应用程序启动时加载这些任务。 def save_tasks(self):tasks []for i in range(self.task_list.count()):# 代码来保存任务with open(tasks.json, w) as file:json.dump(tasks, file)def load_tasks(self):try:with open(tasks.json, r) as file:# 代码来加载任务except Exception as e:print(fError loading tasks: {e})第四部分逐步构建项目 1. 构建静态窗口方法初始化__init__详解 类定义和初始化 class TodoList(QMainWindow):def __init__(self):super().__init__()TodoList 类继承自 PyQt5 的 QMainWindow 类提供了一个主窗口框架。__init__ 方法是类的构造函数用于初始化这个窗口。super().__init__() 调用基类的构造函数是创建窗口的基本步骤。 设置窗口属性 self.setWindowTitle(待办事项列表) self.setGeometry(300, 300, 600, 500) self.setWindowIcon(QIcon(icon.png))setWindowTitle 设置窗口的标题。setGeometry 设置窗口的位置和大小。这里窗口被放置在屏幕的 (300, 300) 位置大小为 600x500 像素。setWindowIcon 设置窗口的图标。图标文件应该是名为 ‘icon.png’ 的图像文件。 创建中心小部件和布局 central_widget QWidget(self) self.setCentralWidget(central_widget) layout QVBoxLayout(central_widget)创建了一个QWidget作为窗口的中心小部件。setCentralWidget 将这个小部件设置为主窗口的中心区域。QVBoxLayout 创建了一个垂直布局用于在中心小部件中垂直排列其他控件。 添加任务输入框 self.task_input QLineEdit(self) self.task_input.setMinimumHeight(30) self.task_input.returnPressed.connect(self.add_task) layout.addWidget(self.task_input)QLineEdit 创建了一个文本输入框用于输入任务。setMinimumHeight 设置了输入框的最小高度。returnPressed.connect 将输入框中的回车键事件连接到 add_task 方法QLineEdit 控件有一个名为 returnPressed 的信号当用户在该控件中按下回车键时会触发去调用括号内的方法。addWidget 将输入框添加到布局中。 添加控制按钮 buttons_layout QHBoxLayout() add_button QPushButton(添加任务, self) add_button.clicked.connect(self.add_task) buttons_layout.addWidget(add_button)delete_button QPushButton(删除任务, self) delete_button.clicked.connect(self.delete_task) buttons_layout.addWidget(delete_button)edit_button QPushButton(编辑任务, self) edit_button.clicked.connect(self.edit_task) buttons_layout.addWidget(edit_button)layout.addLayout(buttons_layout)QHBoxLayout 创建了一个水平布局。QPushButton 创建了添加、删除和编辑任务的按钮。clicked.connect 将按钮点击事件连接到相应的方法。addWidget 将按钮添加到水平布局中。addLayout 将水平布局添加到主垂直布局中。 添加任务列表、搜索框和进度条 self.task_list QListWidget(self) layout.addWidget(self.task_list)self.search_input QLineEdit(self) self.search_input.setPlaceholderText(搜索任务...) self.search_input.textChanged.connect(self.search_tasks) layout.addWidget(self.search_input)self.process_label QLabel(self) self.process_label.setText(任务进度) layout.addWidget(self.process_label)self.progress_bar MovingTextProgressBar(self) self.progress_bar.setMaximum(100) layout.addWidget(self.progress_bar)QListWidget 创建了一个任务列表。QLineEdit 用作搜索框。QLabel 显示了进度条的标签。MovingTextProgressBar 是一个自定义的进度条类用来展示任务完成进度。 加载任务和应用样式表 self.load_tasks() self.update_progress() self.apply_stylesheet()load_tasks 加载保存的任务。update_progress 更新进度条的状态。apply_stylesheet 应用自定义样式来美化界面。 2. 自定义控件自定义进度条MovingTextProgressBar详解 这段代码定义了一个自定义的进度条控件 MovingTextProgressBar它继承自PyQt5的 QProgressBar。这个自定义控件重写了进度条的绘制方法使得进度条中可以显示带有百分比的文本。让我们逐步分析这段代码 类定义和初始化 class MovingTextProgressBar(QProgressBar):def __init__(self, parentNone):super().__init__(parent)MovingTextProgressBar 类继承自 QProgressBar使用 QProgressBar 的所有功能并添加新的特性。__init__ 方法是构造函数用于初始化这个控件。parent 参数允许这个控件被嵌入到其他QWidget中。 绘制进度条 def paintEvent(self, event):painter QPainter(self)# ... 绘制代码 ...paintEvent 方法是Qt中用于绘制控件的事件处理器。QPainter 对象用于所有绘图操作。 绘制背景 rect self.rect() painter.setBrush(self.palette().color(QPalette.Window)) painter.drawRect(rect)self.rect() 获取控件的矩形区域。setBrush 设置画笔的填充颜色这里使用窗口的默认背景色。drawRect 绘制进度条的背景矩形。 计算并绘制进度 progress_rect QRect(rect) progress_rect.setWidth(int(rect.width() * self.value() / self.maximum())) painter.setBrush(self.palette().color(QPalette.Highlight)) painter.drawRect(progress_rect)计算进度条的宽度基于进度条的当前值和最大值。设置画笔为高亮颜色通常用于进度条的填充颜色。绘制表示进度的矩形。 绘制文本 painter.setPen(self.palette().color(QPalette.Text)) text f{self.value():.2f}% text_rect QRect(rect) text_width painter.fontMetrics().width(text) # ... 文本位置计算和绘制 ...设置画笔颜色用于绘制文本。创建要显示的文本显示当前进度的百分比。fontMetrics().width(text) 用于计算文本的宽度以便于定位。 计算文本位置并绘制 if self.value() 0:text_position max(0, progress_rect.width() - text_width - 5) else:text_position int((rect.width() - text_width) / 2) text_rect.setLeft(text_position) painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, text)根据进度条的填充情况计算文本的位置。如果有进度值大于0则确保文本位于进度条填充的右侧。如果没有进度则将文本居中。drawText 实际绘制文本。 总结 MovingTextProgressBar 类通过重写 paintEvent 方法自定义了进度条的绘制方式。这种自定义控件使得进度条不仅能够显示进度的可视化表示还能在进度条内部显示具体的进度百分比增强了用户界面的信息展示能力。这个自定义控件可以被重复使用在任何需要显示带文本的进度条的场景中。 3. 添加任务add_task 方法详解 获取任务文本 首先我们从QLineEditself.task_input获取用户输入的文本。这是用户希望添加到任务列表中的任务描述。 task_text self.task_input.text() if task_text:...这段代码检查是否有文本输入。如果task_text不为空那么接下来的代码就会执行将这个新任务添加到任务列表中。 创建列表项 接下来我们创建一个QListWidgetItem这将是任务列表中的一个新项。 item QListWidgetItem() item.setSizeHint(QSize(0, 40))这里setSizeHint(QSize(0, 40))是为了确保列表项有足够的空间来展示任务其中40是列表项的高度。 设计任务小部件 现在我们创建一个小部件来展示任务的文本和一个复选框。这个小部件将被放置在任务列表项中。 task_widget QWidget() task_layout QHBoxLayout() task_layout.setContentsMargins(5, 0, 5, 0)我们使用QHBoxLayout水平布局来放置复选框和任务标签。setContentsMargins方法用于设置布局边距。 添加复选框和标签 我们接着添加一个QCheckBox和一个QLabel到布局中。复选框用于标记任务是否完成而标签显示任务的文本。 chkBox QCheckBox() chkBox.stateChanged.connect(self.update_progress)task_label QLabel(task_text) task_label.setMargin(5)task_layout.addWidget(chkBox) task_layout.addWidget(task_label)stateChanged信号连接到update_progress方法这样当复选框的状态改变时进度条会更新。 设置任务小部件的布局并添加到列表 最后我们将这个布局应用到task_widget然后将这个小部件设置为item的小部件。 task_layout.addStretch(1) task_widget.setLayout(task_layout)self.task_list.addItem(item) self.task_list.setItemWidget(item, task_widget)addStretch(1)确保复选框和标签靠左排列余下的空间被拉伸填充。 清除输入字段并更新进度 任务添加到列表后输入框被清空准备接受下一个任务的输入。同时我们调用update_progress方法来更新进度条。 self.task_input.clear() self.update_progress()总结 add_task方法的核心是创建一个新的列表项将用户输入的任务文本放入一个包含复选框和标签的小部件中并将这个小部件添加到任务列表中。这个方法体现了PyQt5在处理用户界面和事件方面的灵活性和强大功能。通过这种方式我们的待办事项列表应用程序能够动态地响应用户的输入提供一个直观且互动的用户体验。 4. 删除任务delete_task 方法详解 循环遍历所选任务 delete_task方法首先遍历所有被用户选中的任务项。在PyQt5中可以通过selectedItems()方法获取到QListWidget中所有被用户选中的项。 for item in self.task_list.selectedItems():...这段代码遍历任务列表中的每个被选中的项item。 删除选中的任务 接下来使用takeItem方法从列表中移除这些选中的项。takeItem需要一个索引参数我们通过row(item)方法获取这个索引。 self.task_list.takeItem(self.task_list.row(item))这里row(item)返回被选中项的索引然后takeItem根据这个索引删除相应的项。 更新进度条 删除任务后进度条需要更新以反映当前任务的完成状态。 self.update_progress()调用update_progress方法来重新计算并更新进度条。 编辑任务edit_task 方法详解 检查是否有任务被选中 在编辑任务前首先检查是否有任务被选中。如果至少有一个任务被选中我们将取第一个选中的任务进行编辑。 selected_items self.task_list.selectedItems() if selected_items:item selected_items[0]...这段代码确定是否有任务被选中并将第一个选中的任务项赋值给item变量。 弹出对话框以编辑任务 使用QInputDialog.getText方法弹出一个对话框允许用户编辑选中任务的文本。这个方法返回用户输入的新文本new_text和一个布尔值ok表示用户是否点击了对话框的确认按钮。 new_text, ok QInputDialog.getText(self, 编辑任务, 任务描述:, QLineEdit.Normal, item.text())这里的item.text()是当前任务的文本用作对话框中的初始值。 更新任务文本 如果用户点击了确认并输入了新文本则更新任务的文本。 if ok and new_text:item.setText(new_text)setText方法用于更新列表项的文本为用户输入的新文本。 总结 delete_task方法通过遍历并移除选中的任务项来实现删除功能而edit_task方法则通过弹出对话框并更新任务文本来实现编辑功能。这两个方法展示了如何在PyQt5应用程序中处理用户交互如选择、删除和编辑列表项。通过这些方法我们的待办事项列表应用变得更加灵活和用户友好使用户能够轻松地管理他们的任务。 5. load_tasks 方法详解 尝试读取任务数据 load_tasks方法首先尝试打开一个名为tasks.json的文件该文件包含以前保存的任务数据。 try:with open(tasks.json, r) as file:tasks json.load(file)... except Exception as e:print(fError loading tasks: {e})这里使用json.load(file)将文件中的JSON数据转换成Python对象。如果文件不存在或者文件格式不正确会抛出异常并打印错误信息。 遍历任务并添加到列表 接下来遍历从文件中加载的每个任务并将它们添加到任务列表中。 for task in tasks:item QListWidgetItem()self.task_list.addItem(item)task_widget QWidget()task_layout QHBoxLayout()task_layout.setContentsMargins(5, 5, 5, 5)chkBox QCheckBox()chkBox.setChecked(task[completed])chkBox.stateChanged.connect(self.update_progress)task_label QLabel(task[text])task_layout.addWidget(chkBox)task_layout.addWidget(task_label)task_layout.addStretch(1)task_widget.setLayout(task_layout)item.setSizeHint(task_widget.sizeHint())self.task_list.setItemWidget(item, task_widget)在这个循环中每个任务被创建为一个QListWidgetItem其中包含一个复选框表示任务是否完成和一个标签显示任务文本。这样做可以确保应用程序在启动时加载用户之前的任务。 6. save_tasks 方法详解 准备保存的任务数据 在save_tasks方法中首先创建一个空列表tasks用于存放将要保存到文件的任务数据。 tasks []遍历任务列表并收集数据 接着遍历任务列表中的每一项收集任务的文本和完成状态。 for i in range(self.task_list.count()):item self.task_list.item(i)widget self.task_list.itemWidget(item)if widget:label widget.findChild(QLabel)checkbox widget.findChild(QCheckBox)tasks.append({text: label.text(), completed: checkbox.isChecked()})这里使用findChild方法来找到每个任务项中的QLabel和QCheckBox并获取它们的文本和勾选状态。 将任务数据保存到文件 最后使用json.dump将任务数据以JSON格式保存到tasks.json文件中。 with open(tasks.json, w) as file:json.dump(tasks, file)这样当用户关闭应用程序时他们的任务数据被保存并且可以在下次打开应用时重新加载。 总结 load_tasks和save_tasks方法是待办事项列表应用程序的关键部分它们确保了任务数据的持久化。通过这些方法用户的任务列表在应用程序关闭和重新打开之间保持一致从而提供了更好的用户体验和数据的持久性。 总结 本文详细介绍了如何使用Python和PyQt5创建一个功能完备的待办事项列表应用程序。从项目概述到环境搭建再到基础概念的讲解和实际构建过程文章全面覆盖了应用程序开发的各个方面。通过复现这个项目可以学习到以下知识PyQt5的基本使用、事件处理和信号槽机制、自定义控件的创建、数据保存。 附录全部代码 import json from PyQt5.QtWidgets import QLabel,QHBoxLayout,QApplication, QMainWindow, QListWidget, QListWidgetItem, QLineEdit, QPushButton, QVBoxLayout, QWidget, QCheckBox, QProgressBar, QInputDialog, QComboBox from PyQt5.QtCore import QSize,QRect, Qt from PyQt5.QtGui import QIcon,QPainter, QColor, QPaletteclass MovingTextProgressBar(QProgressBar):def __init__(self, parentNone):super().__init__(parent)def paintEvent(self, event):painter QPainter(self)# Draw the progress bars backgroundrect self.rect()painter.setBrush(self.palette().color(QPalette.Window)) # Use Window role for backgroundpainter.drawRect(rect)# Calculate the width of the progress barprogress_rect QRect(rect)progress_rect.setWidth(int(rect.width() * self.value() / self.maximum()))painter.setBrush(self.palette().color(QPalette.Highlight)) # Use Highlight role for progresspainter.drawRect(progress_rect)# Set the text colorpainter.setPen(self.palette().color(QPalette.Text)) # Use Text role for text color# Calculate the text positiontext f{self.value():.2f}%text_rect QRect(rect)text_width painter.fontMetrics().width(text)# Draw the textif self.value() 0:# If there is progress, ensure the text is on the right side of the filled areatext_position max(0, progress_rect.width() - text_width - 5) # Use max to avoid negative positionelse:# If there is no progress, center the texttext_position int((rect.width() - text_width) / 2) # Cast to int to ensure correct argument typetext_rect.setLeft(text_position)painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, text)class TodoList(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(待办事项列表)self.setGeometry(300, 300, 600, 500)self.setWindowIcon(QIcon(icon.png)) # 设置窗口图标确保 icon.png 在您的文件夹中 central_widget QWidget(self)self.setCentralWidget(central_widget)layout QVBoxLayout(central_widget)layout.setSpacing(10)layout.setAlignment(Qt.AlignTop)self.task_input QLineEdit(self)self.task_input.setMinimumHeight(30)self.task_input.returnPressed.connect(self.add_task) # 连接信号layout.addWidget(self.task_input)# Create a horizontal layout for the buttonsbuttons_layout QHBoxLayout()# Add Task Buttonadd_button QPushButton(添加任务, self)add_button.clicked.connect(self.add_task)buttons_layout.addWidget(add_button)# Delete Task Buttondelete_button QPushButton(删除任务, self)delete_button.clicked.connect(self.delete_task)buttons_layout.addWidget(delete_button)# Edit Task Buttonedit_button QPushButton(编辑任务, self)edit_button.clicked.connect(self.edit_task)buttons_layout.addWidget(edit_button)# Add the horizontal layout to the main vertical layoutlayout.addLayout(buttons_layout)self.task_list QListWidget(self)layout.addWidget(self.task_list)self.search_input QLineEdit(self)self.search_input.setPlaceholderText(搜索任务...)self.search_input.textChanged.connect(self.search_tasks)layout.addWidget(self.search_input)self.process_label QLabel(self)self.process_label.setText(任务进度)layout.addWidget(self.process_label)self.progress_bar MovingTextProgressBar(self)self.progress_bar.setMaximum(100)layout.addWidget(self.progress_bar)self.load_tasks()self.update_progress() # Update the progress barself.apply_stylesheet()def apply_stylesheet(self):self.setStyleSheet( QListWidget, QLineEdit, QProgressBar, QComboBox { font-size: 14px; border: 1px solid #c0c0c0; border-radius: 5px; padding: 5px; } QPushButton { background-color: #5cacee; border-radius: 5px; color: white; padding: 6px; margin: 5px 0; } QPushButton:hover { background-color: #1e90ff; } )def add_task(self):task_text self.task_input.text()if task_text:# 创建一个新的QListWidgetItem并设置其大小提示item QListWidgetItem()item.setSizeHint(QSize(0, 40)) # 根据需要调整高度# 创建包含复选框和标签的小部件task_widget QWidget()task_layout QHBoxLayout()task_layout.setContentsMargins(5, 0, 5, 0) # 适当设置边距# 创建复选框并连接状态变化信号chkBox QCheckBox()chkBox.stateChanged.connect(self.update_progress)# 创建标签显示文本task_label QLabel(task_text)task_label.setMargin(5) # 如果文本靠得太近可以添加一些边距# 将复选框和标签添加到布局task_layout.addWidget(chkBox)task_layout.addWidget(task_label)task_layout.addStretch(1) # 添加拉伸因子使得控件靠左排列# 设置任务小部件的布局task_widget.setLayout(task_layout)# 将任务小部件设置为列表项的小部件self.task_list.addItem(item)self.task_list.setItemWidget(item, task_widget)# 清除输入字段并更新进度self.task_input.clear()self.update_progress()def delete_task(self):for item in self.task_list.selectedItems():self.task_list.takeItem(self.task_list.row(item))self.update_progress()def update_progress(self):total_tasks self.task_list.count()completed_tasks sum(1 for i in range(total_tasks) ifself.task_list.itemWidget(self.task_list.item(i)).findChild(QCheckBox).isChecked())# Protect against division by zero if there are no tasksprogress int((completed_tasks / total_tasks) * 100) if total_tasks 0 else 0self.progress_bar.setValue(progress)self.progress_bar.setFormat(f{progress:.2f}% if progress 0 else 0.00%)self.save_tasks()def edit_task(self):selected_items self.task_list.selectedItems()if selected_items:item selected_items[0]new_text, ok QInputDialog.getText(self, 编辑任务, 任务描述:, QLineEdit.Normal, item.text())if ok and new_text:item.setText(new_text)def closeEvent(self, event):tasks []for i in range(self.task_list.count()):item self.task_list.item(i)widget self.task_list.itemWidget(item)if widget:checkbox widget.findChild(QCheckBox)tasks.append({text: item.text(), completed: checkbox.isChecked()})with open(tasks.json, w) as file:json.dump(tasks, file)event.accept()def load_tasks(self):try:with open(tasks.json, r) as file:tasks json.load(file)for task in tasks:item QListWidgetItem()self.task_list.addItem(item)task_widget QWidget()task_layout QHBoxLayout()task_layout.setContentsMargins(5, 5, 5, 5)chkBox QCheckBox()# First, disconnect any existing connections to avoid duplicate signalstry:chkBox.stateChanged.disconnect()except TypeError:# If there is no connection, a TypeError is thrown, which is finepass# Then, set the checked statechkBox.setChecked(task[completed])# Now, connect the signal to the slotchkBox.stateChanged.connect(self.update_progress)task_label QLabel(task[text])task_layout.addWidget(chkBox)task_layout.addWidget(task_label)task_layout.addStretch(1)task_widget.setLayout(task_layout)item.setSizeHint(task_widget.sizeHint())self.task_list.setItemWidget(item, task_widget)# After all tasks have been loaded, update the progress barself.update_progress()except Exception as e:print(fError loading tasks: {e})# 新增 sort_tasks 方法def search_tasks(self, keyword):for i in range(self.task_list.count()):item self.task_list.item(i)widget self.task_list.itemWidget(item)if widget:label widget.findChild(QLabel)# 确保我们找到了标签并且比较其文本if label and keyword.lower() in label.text().lower():item.setHidden(False)else:item.setHidden(True)# 程序结束时调用def closeEvent(self, event):self.save_tasks()super().closeEvent(event)# 新增保存和加载任务的方法def save_tasks(self):tasks []for i in range(self.task_list.count()):item self.task_list.item(i)widget self.task_list.itemWidget(item)if widget:label widget.findChild(QLabel)checkbox widget.findChild(QCheckBox)task_text label.text() if label else task_completed checkbox.isChecked() if checkbox else Falsetasks.append({text: task_text, completed: task_completed})with open(tasks.json, w) as file:json.dump(tasks, file)app QApplication([]) window TodoList() window.show() app.exec_()
http://wiki.neutronadmin.com/news/240438/

相关文章:

  • 做seo时网站发文目的蚌埠做网站公司
  • 惠州专业的免费建站做网站所具备的的条件
  • 河北省质监站网址建设网站主要有哪些技术
  • 沈阳网站推广深圳品牌做网站公司
  • 怎么做ppt教程网站电子商务公司属于什么行业类型
  • 别人做的网站打不开哪个网络推广公司好
  • 个人怎么做优惠券网站东莞装饰网站建设
  • 免费网站建设模板下载宁波手机网站开发公司
  • 做网站原型图是用什么软件wordpress如何修改后台路径
  • 上海网站建设招聘义乌创源网站建设
  • 茂名企业建站模板阿里云是不是做网站的
  • 电子商务网站名字网站做线上销售
  • 网站的ui规范专业网站建设新闻
  • 饮料网站建设规划书四川手机网
  • 文山州中小企业网站建设店铺设计图纸及效果图大全
  • 网站容易出现的问题吗科技布
  • 寻找定制型网站建设怎样给网站换空间
  • 网站asp源码2023新闻摘抄大全
  • 昆明seo关键词排名熊掌号结合网站做seo
  • 网站平台运营方案免费html网站模板
  • 扬州做企业网站招聘网页制作工程师
  • 制做网站的公司建筑公司网站广告宣传语
  • 有ip怎么用自己的主机做网站住房城乡建设局网站
  • 青岛在线制作网站wordpress ip更换域名
  • 山西省住房和城乡建设厅官方网站厦门汽车充电站建设报备网站
  • p2p借贷网站建设怎么申请个人网站
  • 福州网站设计培训html网站制作模板
  • 算卦网站哪里可以做ui设计难学吗
  • 安徽质量工程建设网站恩施网站制作公司
  • 含山建设局网站广州建网站价格