TOGGLE_BOTTON控件

TOGGLE_BUTTON 属性解析
本文介绍了 TOGGLE_BUTTON 的一个新属性 VALUE 的使用方法。VALUE 属性可以设置为 ON 或 OFF,分别表示开启或关闭状态。同时展示了如何通过 ACTION 进行模块切割。

TOGGLE_BUTTON ROBOT_PROGRAM_SHOW_PATH 
 LABEL 显示位姿 
 BITMAP pdw_view 
 VALUE ON 
        ACTIONS ModuleCutting 

 

多了一个属性:VALUE,ON表示开,OFF表示关 

 

 

import tkinter as tk class Join: def __init__(self): self.window3 = tk.Tk() self.window3.title("商品入库") self.window3.geometry("1280x800+200+100") class Back: def __init__(self): self.window4 = tk.Tk() self.window4.title("商品出库") self.window4.geometry("1280x800+200+100") class Price: def __init__(self): self.window5 = tk.Tk() self.window5.title("利润核算") self.window5.geometry("1280x800+200+100") class Stock: def __init__(self): self.window5 = tk.Tk() self.window5.title("库存数量") self.window5.geometry("1280x800+200+100") class Welcome: def __init__(self): """将tk赋值给self,window1以命名达到调用此窗口的目的""" self.window1 = tk.Tk() self.window1.config(bg="lightblue") self.window1.title("nv666") self.window1.geometry("800x400+430+300") main_frame = tk.Frame(self.window1) "Label1显示窗口中的文本并定义字体和颜色" label_1 = tk.Label(text='欢迎来到AKRI财务系统', font=("微软雅黑", 50), bg="lightblue") "Pack定义该Label1的位置" label_1.pack(pady=80) """设定首页按钮join和exit""" BT1 = tk.Button(text="进入", command=self.LoginWindow, font=("Youyuan", 18), width=20, height=2, relief="groove") BT2 = tk.Button(text="返回", command=self.closeMainWindow, font=("Youyuan", 18), width=20, height=2, relief="groove") """place定位精确按钮坐标""" "botton1负责'Join进入'按钮" BT1.place(x=100, y=250) "botton2负责'Exit退出'按钮" BT2.place(x=450, y=250) "不允许拓展.调用了place(绝对位置)允许拓展会使按钮变换位置" self.window1.resizable(False, False) "窗口持续运行" self.window1.mainloop() def LoginWindow(self): self.closeMainWindow() self.window2 = tk.Tk() "设置window2的背景色为浅绿色" self.window2.config(bg="lightgreen") self.window2.title("首页") self.window2.geometry("1280x800+200+100") "定义左侧frame列" main_frame1 = tk.Frame(self.window2, bg="lightgray") main_frame1.pack(expand=0, side="left", ipadx=130, ipady=1000) "frame不受子控件的影响而改变width宽度" main_frame1.pack_propagate(False) "商品入库按钮绑定父类为join" BT_frame = tk.Frame(main_frame1) tk.Button(main_frame1, text="商品入库", command=Join, font=("Youyuan", 18), width=20, height=2, relief="groove").pack(anchor='nw') tk.Button(main_frame1, text="商品出库", command=Back, font=("Youyuan", 18), width=20, height=2, relief="groove").pack(anchor='nw') tk.Button(main_frame1, text="利润核算", command=Price, font=("Youyuan", 18), width=20, height=2, relief="groove").pack(anchor='nw') tk.Button(main_frame1, text="点我隐藏", command=Stock, font=("Youyuan", 18), width=20, height=2, relief="groove").pack(anchor='nw') "窗口打开循环:使窗口不会自动关闭" self.window2.mainloop() "调用Close函数以达到隐藏窗口的效果" def closeMainWindow(self): self.window1.destroy() if __name__ == "__main__": Welcome() # 程序入口 怎么样让我的所有按钮的功能在同一个窗口下完成
09-25
<think>我们之前已经添加了状态切换按钮,并连接到了`toggle_package_status`方法。现在需要实现这个方法。 功能:切换选中配件包的启用/禁用状态,并更新表格显示和按钮文本。 步骤: 1. 获取当前选中的行索引。 2. 如果未选中任何行,则提示用户。 3. 切换该行对应的配件包的状态(enabled字段)。 4. 更新表格中该行的状态显示(重新填充该行或仅更新状态列)。 5. 更新按钮的文本(因为选中行后按钮文本会随状态改变)。 注意:我们已经在`get_selected_package`方法中实现了选中行的获取,并且该方法还会更新按钮的可用状态和文本。 因此,我们可以在`toggle_package_status`方法中: - 获取选中行 - 切换状态 - 更新表格(通过重新填充整个表格或仅更新该行的状态列) - 刷新按钮状态(通过调用`get_selected_package`来更新按钮文本) 为了简单起见,我们可以直接调用`populate_table`来刷新整个表格,但如果数据量大可能会导致性能问题。因此,我们可以选择只更新状态列。 但是,考虑到我们之前的设计,当状态切换后,可能还需要更新按钮文本(当选中同一行时,按钮文本应该变为相反的状态)。我们可以在切换状态后,再次调用`get_selected_package`(实际上在点击按钮后,当前选中的行并没有改变,所以我们需要更新按钮文本)来刷新按钮文本。 然而,在`get_selected_package`方法中,我们根据当前选中的行来设置按钮文本。所以,我们可以在切换状态后,手动更新按钮文本,或者通过模拟选中状态改变来触发更新。 更简单的方式是:在切换状态后,我们清除当前选择,然后重新选中该行,这样就会触发`get_selected_package`(需要连接selectionModel的信号)。但我们目前没有连接这个信号。 所以我们选择: - 切换状态后,更新表格中该行的状态列(不刷新整个表格) - 然后更新按钮的文本 但是,我们也可以选择刷新整个表格,因为数据量不会很大。为了保持代码简单,我们使用`populate_table`刷新整个表格,然后重新设置选中行并更新按钮状态。 另一种折中:在`populate_table`之后,我们重新选中之前选中的行,并调用`get_selected_package`来更新按钮状态。 具体实现如下: </think>下面我将详细实现 `toggle_package_status` 函数并提供完整的代码示例。这个函数是用于切换配件包启用/禁用状态的核心功能。 ```python def toggle_package_status(self): """切换选中配件包的启用/禁用状态""" # 获取当前选中的行 row = self.get_selected_package() if row is None: return # 获取当前状态 package = self.packages[row] current_status = package.get("enabled", True) # 切换状态 new_status = not current_status package["enabled"] = new_status # 更新表格显示 self.update_package_row(row, package) # 更新按钮文本 self.update_button_status(row) # 显示状态变更通知 package_name = package.get("name", "未知配件包") status_text = "启用" if new_status else "禁用" QMessageBox.information( self, "状态更新", f"配件包 '{package_name}' 已{status_text}" ) def update_package_row(self, row, package): """更新指定行的状态显示""" # 获取状态项 status_item = self.table.item(row, 5) if not status_item: status_item = QTableWidgetItem() status_item.setTextAlignment(Qt.AlignCenter) self.table.setItem(row, 5, status_item) # 更新状态文本和颜色 new_status = package.get("enabled", True) status_item.setText("启用" if new_status else "禁用") if new_status: status_item.setForeground(QColor(0, 128, 0)) # 启用状态绿色 else: status_item.setForeground(QColor(255, 0, 0)) # 禁用状态红色 def update_button_status(self, row): """根据当前状态更新按钮文本""" current_status = self.packages[row].get("enabled", True) self.toggle_status_btn.setText("禁用" if current_status else "启用") def get_selected_package(self): """获取选中的配件包,同时更新按钮状态""" selected_rows = self.table.selectionModel().selectedRows() if not selected_rows: # 没有选中行时禁用操作按钮 self.edit_btn.setEnabled(False) self.delete_btn.setEnabled(False) self.toggle_status_btn.setEnabled(False) return None # 有选中行时启用按钮 self.edit_btn.setEnabled(True) self.delete_btn.setEnabled(True) self.toggle_status_btn.setEnabled(True) # 获取选中行索引 row = selected_rows[0].row() # 更新状态按钮文本 current_status = self.packages[row].get("enabled", True) self.toggle_status_btn.setText("禁用" if current_status else "启用") return row ``` ### 功能说明和代码解释 1. **`toggle_package_status` 核心功能**: - 获取当前选中的行索引 - 切换对应配件包的状态值(`enabled`字段) - 更新表格显示和按钮状态 - 显示状态变更通知 2. **`update_package_row` 状态显示更新**: - 确保状态项存在(第6列) - 根据状态设置文本("启用"或"禁用") - 设置文本颜色:启用状态为绿色,禁用状态为红色 - 文本居中对齐显示 3. **`update_button_status` 按钮状态更新**: - 根据当前配件包状态设置按钮文本 - 如果当前是启用状态,按钮显示"禁用" - 如果当前是禁用状态,按钮显示"启用" 4. **`get_selected_package` 选中处理**: - 无选中行时禁用所有操作按钮 - 有选中行时启用按钮并更新状态按钮文本 - 包含状态按钮文本的实时更新逻辑 ### 完整类实现(包含状态切换功能) ```python class ComponentPackageDialog(QDialog): """配件包配置编辑对话框""" def __init__(self, parent=None): super().__init__(parent) # ... 其他初始化代码不变 ... self.init_ui() def init_ui(self): # ... 其他UI代码不变 ... # 按钮区域 btn_layout = QHBoxLayout() self.add_btn = QPushButton("添加配件包") self.add_btn.clicked.connect(self.add_package) btn_layout.addWidget(self.add_btn) self.edit_btn = QPushButton("编辑选中项") self.edit_btn.clicked.connect(self.edit_package) btn_layout.addWidget(self.edit_btn) self.delete_btn = QPushButton("删除选中项") self.delete_btn.clicked.connect(self.delete_package) btn_layout.addWidget(self.delete_btn) # 状态切换按钮 self.toggle_status_btn = QPushButton("启用/禁用") self.toggle_status_btn.clicked.connect(self.toggle_package_status) self.toggle_status_btn.setEnabled(False) # 初始禁用 btn_layout.addWidget(self.toggle_status_btn) # ... 其他代码不变 ... # 上面定义的所有函数都应放在这里 def toggle_package_status(self): # ... 如前所述 ... def update_package_row(self, row, package): # ... 如前所述 ... def update_button_status(self, row): # ... 如前所述 ... def get_selected_package(self): # ... 如前所述 ... def populate_table(self): """填充表格数据""" self.table.setRowCount(len(self.packages)) # 设置最小行高以容纳明细文本 self.table.verticalHeader().setDefaultSectionSize(80) for row, package in enumerate(self.packages): # 配件包ID id_item = QTableWidgetItem(str(row + 1)) id_item.setTextAlignment(Qt.AlignCenter) self.table.setItem(row, 0, id_item) # 名称 self.table.setItem(row, 1, QTableWidgetItem(package.get("name", ""))) # 显示名称 self.table.setItem(row, 2, QTableWidgetItem(package.get("display_name", ""))) # 目标类型数量 targets_count = len(package.get("targets", [])) count_item = QTableWidgetItem(str(targets_count)) count_item.setTextAlignment(Qt.AlignCenter) self.table.setItem(row, 3, count_item) # 目标类型明细 details = self.format_target_details(package.get("targets", [])) detail_item = QTableWidgetItem(details) detail_item.setToolTip(details) # 添加悬停提示 self.table.setItem(row, 4, detail_item) # 状态列 status = package.get("enabled", True) status_item = QTableWidgetItem("启用" if status else "禁用") status_item.setTextAlignment(Qt.AlignCenter) if status: status_item.setForeground(QColor(0, 128, 0)) # 启用状态绿色 else: status_item.setForeground(QColor(255, 0, 0)) # 禁用状态红色 self.table.setItem(row, 5, status_item) # ... 其他方法保持不变 ... ``` ### 关键功能实现要点 1. **状态持久化**: - 状态信息保存在 `enabled` 字段中 - 加载配置时确保旧数据有默认值(在 `load_config` 方法中) - 保存配置时会自动保存状态字段 2. **用户体验细节**: - 状态按钮文本实时更新 - 状态变化后显示通知 - 状态列使用颜色编码(绿色启用,红色禁用) - 无选中行时禁用操作按钮 3. **性能优化**: - 仅更新变化行而不是整个表格 - 避免不必要的全表刷新 4. **错误处理**: - 确保状态项存在后才更新 - 处理各种边界情况(如无效行索引)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值