凊风 发表于 2024-5-8 21:29:24

FishC 发表于 2024-5-8 21:17
非常抱歉卡住了,以下是修改后的完整代码:




不要重新写了了,就用下面这一段来慢慢修改吧/
    def setup_area_selection(self, comboboxes, data_model):
      levels = len(comboboxes)
      data_model = pd.read_excel(self.Region_file)
      df = pd.DataFrame(data_model)

      for i in range(levels):
            combobox = comboboxes
            current_level = i + 1
            selected_code = ''

            # 获取上一级选择的区划代码
            if i > 0:
                previous_combobox = comboboxes
                selected_code = previous_combobox.currentData()

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (i + 1) * 2
                filtered_data = df.astype(str).str[:code_length] == str(selected_code)[:code_length]]
            else:
                filtered_data = df == current_level]

            # 更新当前级别的 QComboBox
            combobox.clear()
            combobox.addItem("请选择")
            for index, row in filtered_data.iterrows():
                name = row['名称']
                code = row['区划代码']
                combobox.addItem(name, code)

现在的问题是没有正确筛选。
其实筛选原则就是:
self.combobox的数据通过level=1来显示;
然后self.combobox_2的数据通过self.combobox的区划代码前2位相同来筛选(毕竟只有区划代码是唯一的);
然后self.combobox_3的数据又通过self.combobox_2的区划代码前4位相同来筛选;
然后self.combobox_4的数据又通过self.combobox_3的区划代码前6位相同来筛选;
然后self.combobox_5的数据又通过self.combobox_4的区划代码前9位相同来筛选。

能实现吗?

FishC 发表于 2024-5-8 21:29:40

凊风 发表于 2024-05-08 21:29
不要重新写了了,就用下面这一段来慢慢修改吧/
    d ...

非常抱歉之前的修改依然有问题。根据您的需求,以下是经过修正的代码,按照指定的筛选规则逐层进行数据筛选:

from PySide6.QtWidgets import QComboBox
import pandas as pd

def setup_area_selection(self, comboboxes, data_model):
    levels = len(comboboxes)
    data_model = pd.read_excel(self.Region_file)
    df = pd.DataFrame(data_model)

    for i in range(levels):
      combobox = comboboxes
      current_level = i + 1
      selected_code = ""

      # 获取上一级选择的区划代码
      if i > 0:
            previous_combobox = comboboxes
            selected_code = previous_combobox.currentData()

      # 根据当前级别和区划代码进行筛选
      if selected_code:
            code_length = (i + 1) * 2
            filtered_data = df.str[:code_length] == selected_code]
      else:
            filtered_data = df == current_level]

      # 更新当前级别的 QComboBox
      combobox.clear()
      combobox.addItem("请选择")
      for index, row in filtered_data.iterrows():
            name = row["名称"]
            code = row["区划代码"]
            combobox.addItem(name, code)
请尝试使用这段修正后的代码,并确保 `data_model` 的格式与您的要求相匹配。希望这次能够成功实现筛选功能。如果还有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-8 21:32:08

FishC 发表于 2024-5-8 21:29
非常抱歉之前的修改依然有问题。根据您的需求,以下是经过修正的代码,按照指定的筛选规则逐层进行数据 ...

所有combobox都能刷出数据!!
就是需要实现self.combobox_3的数据又通过self.combobox_2的区划代码前4位相同来筛选;
然后self.combobox_4的数据又通过self.combobox_3的区划代码前6位相同来筛选;
然后self.combobox_5的数据又通过self.combobox_4的区划代码前9位相同来筛选。

FishC 发表于 2024-5-8 21:32:29

凊风 发表于 2024-05-08 21:32
所有combobox都能刷出数据!!
就是需要实现self.com ...

非常高兴听到所有的 `QComboBox` 都能正确刷出数据了!要实现 `self.combobox_3` 的数据通过 `self.combobox_2` 的区划代码前4位相同来筛选,以及后续 `self.combobox_4` 和 `self.combobox_5` 的区划代码前6位和9位相同来筛选,您可以按照以下方式修改代码:

from PySide6.QtWidgets import QComboBox
import pandas as pd

def setup_area_selection(self, comboboxes, data_model):
    levels = len(comboboxes)
    data_model = pd.read_excel(self.Region_file)
    df = pd.DataFrame(data_model)

    for i in range(levels):
      combobox = comboboxes
      current_level = i + 1
      selected_code = ''

      # 获取上一级选择的区划代码
      if i > 0:
            previous_combobox = comboboxes
            selected_code = previous_combobox.currentData()

      # 根据当前级别和区划代码进行筛选
      if selected_code:
            code_length = (i + 1) * 2
            filtered_data = df == str(selected_code)[:code_length]]
      else:
            filtered_data = df

      # 更新当前级别的 QComboBox
      combobox.clear()
      combobox.addItem("请选择")
      for index, row in filtered_data.iterrows():
            name = row['名称']
            code = row['区划代码']
            combobox.addItem(name, code)

这样应该可以实现逐层筛选的效果了。请尝试运行并检查结果。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-8 21:36:13

FishC 发表于 2024-5-8 21:32
非常高兴听到所有的 `QComboBox` 都能正确刷出数据了!要实现 `self.combobox_3` 的数据通过 `self.com ...

算了 明天继续
今天所有的 `QComboBox` 都能正确刷出数据已经很大进步了,谢谢你。

FishC 发表于 2024-5-8 21:36:30

凊风 发表于 2024-05-08 21:36
算了 明天继续
今天所有的 `QComboBox` 都能正确刷出 ...

非常高兴能帮助到您!如果您有任何其他问题,请随时提问。祝您度过愉快的一天,明天继续努力!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 07:11:16

FishC 发表于 2024-5-8 21:36
非常高兴能帮助到您!如果您有任何其他问题,请随时提问。祝您度过愉快的一天,明天继续努力!

以上 ...

早啊~
我好像发现问题所在了。
下列代码中:
    def setup_area_selection(self, comboboxes, data_model):
      levels = len(comboboxes)
      data_model = pd.read_excel(self.Region_file)
      df = pd.DataFrame(data_model)

      for i in range(levels):
            print('111i:', i)
            combobox = comboboxes
            current_level = i + 1
            selected_code = ''

            # 获取上一级选择的区划代码
            if i > 0:
                previous_combobox = comboboxes
                print('222previous_combobox:', previous_combobox)
                selected_code = previous_combobox.currentData()
                print('333selected_code:', selected_code)

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (i + 1) * 2
                print('444code_length:', code_length)
                filtered_data = df.astype(str).str[:code_length] == str(selected_code)[:code_length]]
                print('555filtered_data:', filtered_data)
            else:
                filtered_data = df == current_level]

            # 更新当前级别的 QComboBox
            combobox.clear()
            combobox.addItem("请选择")
            for index, row in filtered_data.iterrows():
                name = row['名称']
                code = row['区划代码']
                combobox.addItem(name, code)
                print('666name, code:', name, code)
貌似是程序启动时就把所有combobox的相应级别数据全部加载好了,所以没有起到跟随上层combobox(如省一级)适时筛选下一级combobox(如市一级)的效果,并且还造成程序卡顿(因为数据量大)。

能不能实现先只加载self.combobox的数据(省一级),然后根据self.combobox的选择再适时加载self.combobox_2的数据(市一级),然后根据self.combobox_2的选择再适时加载self.combobox_3的数据(县一级),以此类推...

FishC 发表于 2024-5-9 07:11:42

凊风 发表于 2024-05-09 07:11
早啊~
我好像发现问题所在了。
下列代码中:
    d ...

早上好!根据您的描述,我理解您希望实现一个级联选择的功能,即根据上一级选择的值来动态加载下一级的数据。这样可以减少数据的加载量和程序的卡顿。

要实现这个功能,您可以使用信号和槽机制来实现级联选择。首先,将每个 `QComboBox` 的选择变化连接到一个槽函数,当选择变化时,该槽函数会更新下一级 `QComboBox` 的数据。以下是一个示例代码:

from PySide6.QtWidgets import QApplication, QMainWindow, QComboBox
from PySide6.QtCore import Slot

class AssetManagementSystem(QMainWindow):
    def __init__(self):
      super().__init__()

      self.combobox_1 = QComboBox(self)
      self.combobox_2 = QComboBox(self)
      self.combobox_3 = QComboBox(self)

      # 将每个QComboBox的currentIndexChanged信号连接到update_comboboxes槽函数
      self.combobox_1.currentIndexChanged.connect(self.update_comboboxes)
      self.combobox_2.currentIndexChanged.connect(self.update_comboboxes)
      self.combobox_3.currentIndexChanged.connect(self.update_comboboxes)

      # 初始化第一级QComboBox的数据
      self.setup_area_selection(self.combobox_1, 1)

    @Slot()
    def update_comboboxes(self):
      sender = self.sender()
      
      if sender == self.combobox_1:
            level = 1
            selected_code = self.combobox_1.currentData()
            self.setup_area_selection(self.combobox_2, level + 1, selected_code)
            self.combobox_3.clear()
      elif sender == self.combobox_2:
            level = 2
            selected_code = self.combobox_2.currentData()
            self.setup_area_selection(self.combobox_3, level + 1, selected_code)

    def setup_area_selection(self, combobox, level, selected_code=None):
      # 根据level和selected_code加载combobox的数据
      # 这里的逻辑根据您的具体需求进行实现,这里只是示例代码
      
      # 清空combobox并添加默认项
      combobox.clear()
      combobox.addItem("请选择")
      
      # 根据level和selected_code加载相应的数据
      # 例如,根据选中的省份获取该省份下的城市列表
      if level == 2:
            cities = get_cities(selected_code)
            for city in cities:
                combobox.addItem(city.name, city.code)
      elif level == 3:
            counties = get_counties(selected_code)
            for county in counties:
                combobox.addItem(county.name, county.code)
      # 其他级别的类似逻辑

if __name__ == "__main__":
    app = QApplication([])
    window = AssetManagementSystem()
    window.show()
    app.exec()

在槽函数 `update_comboboxes` 中,根据当前触发信号的 `sender` 判断是哪个 `QComboBox` 触发了选择变化,并根据当前选择的值加载下一级 `QComboBox` 的数据。

请注意,这只是一个示例代码,并不完整。您需要根据您的数据结构和业务逻辑来实现 `setup_area_selection` 函数。同时,也需要根据您项目中的具体需求进行适当的修改。

希望以上信息能对您有所帮助!如果您还有任何问题,请随时提问。祝您编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 07:15:54

FishC 发表于 2024-5-9 07:11
早上好!根据您的描述,我理解您希望实现一个级联选择的功能,即根据上一级选择的值来动态加载下一级的 ...

能否在下列代码中使用信号和槽机制来实现级联选择:
    def setup_area_selection(self, comboboxes, data_model):
      levels = len(comboboxes)
      data_model = pd.read_excel(self.Region_file)
      df = pd.DataFrame(data_model)

      for i in range(levels):
            print('111i:', i)
            combobox = comboboxes
            current_level = i + 1
            selected_code = ''

            # 获取上一级选择的区划代码
            if i > 0:
                previous_combobox = comboboxes
                print('222previous_combobox:', previous_combobox)
                selected_code = previous_combobox.currentData()
                print('333selected_code:', selected_code)

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (i + 1) * 2
                print('444code_length:', code_length)
                filtered_data = df.astype(str).str[:code_length] == str(selected_code)[:code_length]]
                print('555filtered_data:', filtered_data)
            else:
                filtered_data = df == current_level]

            # 更新当前级别的 QComboBox
            combobox.clear()
            combobox.addItem("请选择")
            for index, row in filtered_data.iterrows():
                name = row['名称']
                code = row['区划代码']
                combobox.addItem(name, code)
                print('666name, code:', name, code)

FishC 发表于 2024-5-9 07:16:40

凊风 发表于 2024-05-09 07:15
能否在下列代码中使用信号和槽机制来实现级联选择:
...

当涉及到级联选择时,使用信号和槽机制是一个很好的解决方案。您可以在每个 QComboBox 上定义一个槽函数来响应选择变化,并在其中更新下一级 QComboBox 的数据。以下是一个示例代码,展示了如何使用信号和槽机制来实现级联选择:

from PySide6.QtCore import Qt, Signal, Slot
from PySide6.QtWidgets import QComboBox

class AreaSelectionWidget(QWidget):
    levelChanged = Signal(int)
    selectionChanged = Signal(int, str)

    def __init__(self, parent=None):
      super().__init__(parent)
      self.comboboxes = []
      self.data_model = pd.read_excel(self.Region_file)
      self.df = pd.DataFrame(self.data_model)
      self.create_comboboxes()

    def create_comboboxes(self):
      levels = 3# 设置级别数
      for i in range(levels):
            combobox = QComboBox()
            combobox.currentIndexChanged.connect(self.level_changed)
            self.comboboxes.append(combobox)

    @Slot(int)
    def level_changed(self, index):
      for i, combobox in enumerate(self.comboboxes):
            if i > index:
                combobox.clear()
                continue

            current_level = i + 1
            selected_code = ''
            if i > 0:
                previous_combobox = self.comboboxes
                selected_code = previous_combobox.currentData()

            if selected_code:
                code_length = (i + 1) * 2
                filtered_data = self.df
            else:
                filtered_data = self.df

            combobox.clear()
            combobox.addItem("请选择")
            for _, row in filtered_data.iterrows():
                name = row
                code = row
                combobox.addItem(name, code)

            self.selectionChanged.emit(i, combobox.currentData())

      self.levelChanged.emit(index)

    def setup_layout(self):
      layout = QVBoxLayout(self)
      for combobox in self.comboboxes:
            layout.addWidget(combobox)
      self.setLayout(layout)

在上述代码中,`level_changed` 槽函数通过获取当前选中的索引,并根据索引值更新下一级别的 QComboBox。同时,还发出了 `levelChanged` 和 `selectionChanged` 信号,以供其他部分处理。您可以在槽函数中添加所需的逻辑,以适应您的具体需求。记得在创建 `AreaSelectionWidget` 实例之后,将其添加到您的主窗口中或者显示出来。希望这能帮到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 07:18:09

FishC 发表于 2024-5-9 07:16
当涉及到级联选择时,使用信号和槽机制是一个很好的解决方案。您可以在每个 QComboBox 上定义一个槽函 ...

能否整合成一个函数方便我调用?

FishC 发表于 2024-5-9 07:18:51

凊风 发表于 2024-05-09 07:18
能否整合成一个函数方便我调用?

当然可以!下面是一个整合了信号和槽机制的函数,可以实现级联选择的功能:

def setup_area_selection(self, comboboxes, data_model):
    levels = len(comboboxes)
    data_model = pd.read_excel(self.Region_file)
    df = pd.DataFrame(data_model)

    def update_combobox(index):
      combobox = comboboxes
      selected_code = ''
      
      if index > 0:
            previous_combobox = comboboxes
            selected_code = previous_combobox.currentData()

      if selected_code:
            code_length = (index + 1) * 2
            filtered_data = df
      else:
            filtered_data = df

      combobox.clear()
      combobox.addItem("请选择")
      for _, row in filtered_data.iterrows():
            name = row
            code = row
            combobox.addItem(name, code)

    for i in range(levels):
      combobox = comboboxes
      combobox.currentIndexChanged.connect(lambda index, i=i: update_combobox(i))

    # 初始化第一个 QComboBox
    update_combobox(0)

您可以用自己的 QComboBox 列表和数据模型作为参数调用此函数。它会根据上一级选择的值来动态加载下一级的选项。希望对您有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 07:31:34

FishC 发表于 2024-5-9 07:18
当然可以!下面是一个整合了信号和槽机制的函数,可以实现级联选择的功能:




运行此段代码后,Python直接停止工作了。。。。

FishC 发表于 2024-5-9 07:37:00

凊风 发表于 2024-05-09 07:31
运行此段代码后,Python直接停止工作了。。。。

很抱歉,提供的代码不完整,可能存在一些问题。让我们来修复一下。

首先,确保您已经导入了所需的库(如`pandas`和`PySide6`)。

其次,为了使用信号和槽机制,您需要将`combobox`对象的`currentIndexChanged`信号连接到一个对应的槽函数。在槽函数中,可以获取当前选中的索引并进行相关操作。

修复后的代码如下所示:

from PySide6.QtWidgets import QApplication, QMainWindow, QComboBox
from PySide6.QtCore import Qt

def setup_area_selection(comboboxes, data_model):
    levels = len(comboboxes)
    data_model = pd.read_excel(self.Region_file)
    df = pd.DataFrame(data_model)

    def handle_combobox_changed(index):
      combobox = comboboxes
      current_level = index + 1
      selected_code = ''

      if index > 0:
            previous_combobox = comboboxes
            selected_code = previous_combobox.currentData()

      if selected_code:
            code_length = (index + 1) * 2
            filtered_data = df
      else:
            filtered_data = df

      combobox.clear()
      combobox.addItem("请选择")
      for _, row in filtered_data.iterrows():
            name = row
            code = row
            combobox.addItem(name, code)

    for i, combobox in enumerate(comboboxes):
      combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(i))

      # 设置其他初始化设置
      combobox.setEditable(False)
      combobox.setCurrentIndex(0)

    # 手动触发第一个下拉框的选择事件
    handle_combobox_changed(0)

# 示例用法:
app = QApplication([])
window = QMainWindow()

combobox1 = QComboBox()
combobox2 = QComboBox()
combobox3 = QComboBox()

comboboxes =
data_model = pd.read_excel("your_data_file.xlsx")

setup_area_selection(comboboxes, data_model)

window.setCentralWidget(combobox1)
window.show()

app.exec()

请根据您的实际需求修改代码,并确保所有依赖的库已正确导入。如果问题仍然存在,请提供更多详细信息,以便我们能够帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 09:58:55

FishC 发表于 2024-5-9 07:37
很抱歉,提供的代码不完整,可能存在一些问题。让我们来修复一下。

首先,确保您已经导入了所需的库 ...

报错:
Traceback (most recent call last):
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1186, in <lambda>
    combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(i))
                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1176, in handle_combobox_changed
    filtered_data = df
                  ~~^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\frame.py", line 4077, in __getitem__
    return self.where(key)
         ^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 10981, in where
    return self._where(cond, other, inplace, axis, level)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 10756, in _where
    new_data = self._mgr.where(
               ^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\internals\base.py", line 204, in where
    return self.apply_with_block(
         ^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\internals\managers.py", line 355, in apply
    kwargs = obj.iloc[:, b.mgr_locs.indexer]._values
                ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^

FishC 发表于 2024-5-9 09:59:09

凊风 发表于 2024-05-09 09:58
报错:
Traceback (most recent call last):
File...

非常抱歉,上述代码存在一些问题。以下是一个修复后的示例:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QLabel

class AssetManager(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("资产管理系统")
      
      # 定义主窗口的布局
      main_widget = QWidget()
      main_layout = QVBoxLayout()
      main_widget.setLayout(main_layout)
      self.setCentralWidget(main_widget)
      
      # 创建并添加下拉框和标签
      self.combobox = QComboBox()
      main_layout.addWidget(self.combobox)
      self.label = QLabel()
      main_layout.addWidget(self.label)
      
      # 添加选项到下拉框
      self.combobox.addItems(["选项1", "选项2", "选项3"])
      
      # 连接信号槽
      self.combobox.currentIndexChanged.connect(self.handle_combobox_changed)
      
    def handle_combobox_changed(self, index):
      selected_option = self.combobox.itemText(index)
      self.label.setText(f"您选择了:{selected_option}")
   

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = AssetManager()
    window.show()
    sys.exit(app.exec())

这个示例创建了一个简单的窗口,里面有一个下拉框和一个标签。当选择下拉框中的选项时,标签会显示所选项的文本。

请确保您已经正确导入了PySide6库,然后运行上述代码,看看是否可以正常工作。如果仍然遇到问题,请提供具体的报错信息,以便更好地帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 10:02:01

FishC 发表于 2024-5-9 07:37
很抱歉,提供的代码不完整,可能存在一些问题。让我们来修复一下。

首先,确保您已经导入了所需的库 ...

运行这段代码报错:
Traceback (most recent call last):
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1186, in <lambda>
    combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(i))
                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1176, in handle_combobox_changed
    filtered_data = df
                  ~~^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\frame.py", line 4077, in __getitem__
    return self.where(key)
         ^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 10981, in where
    return self._where(cond, other, inplace, axis, level)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 10756, in _where
    new_data = self._mgr.where(
               ^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\internals\base.py", line 204, in where
    return self.apply_with_block(
         ^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\internals\managers.py", line 355, in apply
    kwargs = obj.iloc[:, b.mgr_locs.indexer]._values
                ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^

FishC 发表于 2024-5-9 10:02:23

凊风 发表于 2024-05-09 10:02
运行这段代码报错:
Traceback (most recent call la ...

非常抱歉,代码依然存在问题。上述错误与 pandas 库的使用有关。这里的问题在于,`filtered_data = df` 这一行并没有筛选数据,导致出现了错误。您需要使用适当的筛选条件来过滤数据。

以下是一个修复后的示例:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem, QLabel, QComboBox
import pandas as pd

# 创建主窗口类
class AssetManagementSystem(QMainWindow):
    def __init__(self, data):
      super().__init__()
      self.setWindowTitle("资产管理系统")
      self.data = data
      self.init_ui()

    def init_ui(self):
      # 创建布局
      layout = QVBoxLayout()

      # 创建组合框
      combobox = QComboBox()
      combobox.addItem("全部")
      combobox.addItem("类型1")
      combobox.addItem("类型2")
      combobox.addItem("类型3")
      combobox.currentIndexChanged.connect(self.handle_combobox_changed)
      layout.addWidget(combobox)

      # 创建表格
      table_widget = QTableWidget()
      table_widget.setColumnCount(4)
      table_widget.setHorizontalHeaderLabels(["名称", "类型", "购买日期", "价值"])
      table_widget.setRowCount(len(self.data))
      for i, row in enumerate(self.data.iterrows()):
            for j, value in enumerate(row):
                item = QTableWidgetItem(str(value))
                table_widget.setItem(i, j, item)
      layout.addWidget(table_widget)

      # 创建标签
      label = QLabel("总价值:$10000")
      layout.addWidget(label)

      # 创建主窗口部件
      central_widget = QWidget()
      central_widget.setLayout(layout)
      self.setCentralWidget(central_widget)

    def handle_combobox_changed(self, index):
      # 获取选择的类型
      selected_type = self.sender().currentText()

      # 根据选择的类型筛选数据
      if selected_type == "全部":
            filtered_data = self.data
      else:
            filtered_data = self.data == selected_type]

      # 更新表格内容和标签显示
      table_widget = self.centralWidget().findChild(QTableWidget)
      table_widget.setRowCount(len(filtered_data))
      for i, row in enumerate(filtered_data.iterrows()):
            for j, value in enumerate(row):
                item = QTableWidgetItem(str(value))
                table_widget.setItem(i, j, item)

      total_value = filtered_data["价值"].sum()
      label = self.centralWidget().findChild(QLabel)
      label.setText(f"总价值:${total_value}")

if __name__ == "__main__":
    # 读取数据
    data = pd.read_csv("assets.csv")

    # 创建应用程序对象
    app = QApplication(sys.argv)

    # 创建主窗口对象
    main_window = AssetManagementSystem(data)

    # 显示主窗口
    main_window.show()

    # 运行应用程序
    sys.exit(app.exec())

请确保您已经安装了 pandas 和 PySide6 模块,并将数据文件 `assets.csv` 放在相同的文件夹中。注意,这只是一个简单的示例,您可能需要根据实际需求进行修改和扩展。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-5-9 11:37:23

FishC 发表于 2024-5-9 07:37
很抱歉,提供的代码不完整,可能存在一些问题。让我们来修复一下。

首先,确保您已经导入了所需的库 ...

报错:
Traceback (most recent call last):
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1159, in <lambda>
    combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(i))
                                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\Ylqx20240509\Ylqx2024050901.py", line 1147, in handle_combobox_changed
    filtered_data = df == current_level]
                     ^^^^^^^^^^^^^^^^^^^^^^^^^

FishC 发表于 2024-5-9 11:37:37

凊风 发表于 2024-05-09 11:37
报错:
Traceback (most recent call last):
File ...

非常抱歉,代码还是有问题。这里的错误在于使用 `df == current_level` 进行条件筛选。

应该使用 `df == current_level]` 来选择指定列名为 'column_name',且值等于 `current_level` 的行。

例如,假设要根据列名为 'level' 的值进行筛选,可以修改代码如下:

filtered_data = df == current_level]

请将 'column_name' 替换为你实际的列名,确保与数据框中的列名匹配。

另外,还需要确保 `df` 是一个正确的 pandas 数据框对象,且已经成功加载了数据。如果数据框没有正确加载,需要检查数据读取的部分代码是否存在问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 3 4 [5] 6 7 8 9 10 11 12
查看完整版本: 资产管理系统求教~~