鱼C论坛

 找回密码
 立即注册
楼主: 凊风

[已解决]资产管理系统求教~~

  [复制链接]
 楼主| 发表于 2024-5-8 19:55:21 | 显示全部楼层
FishC 发表于 2024-5-8 19:49
很抱歉,我在代码中犯了一个错误。看起来您的数据模型中的某些列不是字符串类型,因此无法使用`.str`操 ...

报错:
Traceback (most recent call last):
   line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
  , line 1131, in setup_area_selection
    filtered_data = data_model[data_model['级别'] == current_level]['名称']
                               ~~~~~~~~~~^^^^^^
TypeError: string indices must be integers, not 'str'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 19:55:44 | 显示全部楼层
凊风 发表于 2024-05-08 19:55
报错:
Traceback (most recent call last):
   lin ...


很抱歉,我忽略了数据模型与当前级别的比较过程中的类型错误。在这种情况下,您可以使用字符串的`.str`方法来进行比较。

以下是修改后的代码:

  1. from PySide6.QtWidgets import QComboBox
  2. import pandas as pd

  3. def setup_area_selection(comboboxes, data_model):
  4.     levels = len(comboboxes)
  5.     df = pd.read_excel(data_model)
  6.    
  7.     for i in range(levels):
  8.         combobox = comboboxes[i]
  9.         
  10.         if i == 0:
  11.             filtered_data = df[df['级别'] == 1]['名称']
  12.         else:
  13.             current_level = i + 1
  14.             selected_code = comboboxes[i - 1].currentData()
  15.             filtered_data = df[df['区划代码'].str.startswith(selected_code) & (df['级别'] == current_level)]['名称']
  16.         
  17.         combobox.clear()
  18.         combobox.addItems(filtered_data)
复制代码


请确保 `self.Region_file` 是一个正确的文件路径,并将 `self.comboboxes` 替换为一个包含所有五个 `QComboBox` 的列表。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 19:58:07 | 显示全部楼层
FishC 发表于 2024-5-8 19:55
很抱歉,我忽略了数据模型与当前级别的比较过程中的类型错误。在这种情况下,您可以使用字符串的`.str` ...

又报错:
Traceback (most recent call last):
  line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1135, in setup_area_selection
    filtered_data = df[df['区划代码'].str.startswith(selected_code) & (df['级别'] == current_level)]['名称']
                       ^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 6296, in __getattr__
    return object.__getattribute__(self, name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\accessor.py", line 224, in __get__
    accessor_obj = self._accessor(obj)
                   ^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 191, in __init__
    self._inferred_dtype = self._validate(data)
                           ^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 245, in _validate
    raise AttributeError("Can only use .str accessor with string values!")
AttributeError: Can only use .str accessor with string values!. Did you mean: 'std'?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 19:58:30 | 显示全部楼层
凊风 发表于 2024-05-08 19:58
又报错:
Traceback (most recent call last):
  li ...


非常抱歉,我再次犯了同样的错误。看来在处理数据时仍然出现了类型问题。

为了解决这个问题,我们可以将区划代码转换为字符串类型,然后使用 `.str`方法进行比较。请修改如下:

  1. from PySide6.QtWidgets import QComboBox
  2. import pandas as pd

  3. def setup_area_selection(comboboxes, data_file):
  4.     levels = len(comboboxes)
  5.     df = pd.read_excel(data_file)
  6.     df['区划代码'] = df['区划代码'].astype(str)  # 将区划代码列转换为字符串类型
  7.   
  8.     for i in range(levels):
  9.         combobox = comboboxes[i]
  10.         current_level = i + 1
  11.         selected_code = ''
  12.         if i > 0:
  13.             selected_code = comboboxes[i - 1].currentData()
  14.       
  15.         filtered_data = df[df['区划代码'].str.startswith(selected_code) & (df['级别'] == current_level)]
  16.         options = filtered_data['名称'].tolist()
  17.       
  18.         combobox.clear()
  19.         combobox.addItems(options)
复制代码


请将其中的 `data_file` 替换为您实际的区划数据文件路径。如果问题仍然存在,请提供具体的错误信息,以便我能够更好地帮助您。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:01:17 | 显示全部楼层
FishC 发表于 2024-5-8 19:58
非常抱歉,我再次犯了同样的错误。看来在处理数据时仍然出现了类型问题。

为了解决这个问题,我们可 ...

报错:
Traceback (most recent call last):
   line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1135, in setup_area_selection
    filtered_data = df[df['区划代码'].str.startswith(selected_code) & (df['级别'] == current_level)]
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 137, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 2482, in startswith
    raise TypeError(msg)
TypeError: expected a string or tuple, not NoneType
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:03:34 | 显示全部楼层
凊风 发表于 2024-05-08 20:01
报错:
Traceback (most recent call last):
   lin ...


非常抱歉,我之前的修改也有问题。这次,我将使用更简单的方法来实现区划选择的功能。

以下是修改后的代码,请再次尝试:

from PySide6.QtWidgets import QComboBox
import pandas as pd

def setup_area_selection(combo_boxes, data_path):
    area_data = pd.read_excel(data_path)
    max_level = len(combo_boxes)

    def update_combo_box(index, current_code):
        combo_box = combo_boxes[index]
        combo_box.clear()
        combo_box.addItem("请选择")

        if index == 0:
            filtered_data = area_data[area_data['级别'] == 1]
            combo_box.addItems(filtered_data['名称'].tolist())

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:09:44 | 显示全部楼层
FishC 发表于 2024-5-8 20:03
非常抱歉,我之前的修改也有问题。这次,我将使用更简单的方法来实现区划选择的功能。

以下是修改后 ...

这次运行没有任何反应。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:10:00 | 显示全部楼层
凊风 发表于 2024-05-08 20:09
这次运行没有任何反应。。。


非常抱歉,我之前的修改仍然存在问题。让我们再次尝试并进行修复。

以下是修改后的代码,请再次尝试:

  1. from PySide6.QtWidgets import QComboBox
  2. import pandas as pd

  3. def setup_area_selection(comboboxes, data_model):
  4.     df = pd.read_excel(data_model)
  5.     comboboxes[0].clear()
  6.     comboboxes[0].addItems(df.loc[df['级别'] == 1, '名称'])
  7.    
  8.     def handle_combobox_change(index):
  9.         current_combobox = comboboxes[index]
  10.         current_level = index + 1
  11.         
  12.         selected_code = df.loc[df['名称'] == current_combobox.currentText(), '区划代码'].values[0]
  13.         
  14.         if index < len(comboboxes) - 1:
  15.             next_combobox = comboboxes[index + 1]
  16.             next_level = current_level + 1
  17.             next_combobox.clear()
  18.             next_combobox.addItems(df.loc[df['区划代码'].str.startswith(selected_code) & (df['级别'] == next_level), '名称'])
  19.    
  20.     for i in range(len(comboboxes)):
  21.         comboboxes[i].currentIndexChanged.connect(lambda index, i=i: handle_combobox_change(i))
复制代码


请确保在调用 `setup_area_selection()` 函数时,传递正确的 `comboboxes` 对象和 `data_model` 路径。例如:

  1. self.comboboxes = [self.comboBox, self.comboBox_2, self.comboBox_3, self.comboBox_4, self.comboBox_5]
  2. self.data_model = "E:/Temp/行政区划代码库.xlsx"

  3. self.setup_area_selection(self.comboboxes, self.data_model)
复制代码


这样应该能够正确显示和更新所有级别的 `QComboBox` 数据,并根据用户的选择进行相应的联动更新。如果问题还未解决,请提供更多的报错信息以帮助我更好地理解问题所在。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:12:57 | 显示全部楼层
FishC 发表于 2024-5-8 20:10
非常抱歉,我之前的修改仍然存在问题。让我们再次尝试并进行修复。

以下是修改后的代码,请再次尝试 ...

选择省级名称后,报错:
Traceback (most recent call last):
   line 1142, in <lambda>
    comboboxes[i].currentIndexChanged.connect(lambda index, i=i: handle_combobox_change(i))
                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^
  line 1139, in handle_combobox_change
    df.loc[df['区划代码'].str.startswith(selected_code) & (df['级别'] == next_level), '名称'])
           ^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\generic.py", line 6296, in __getattr__
    return object.__getattribute__(self, name)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\accessor.py", line 224, in __get__
    accessor_obj = self._accessor(obj)
                   ^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 191, in __init__
    self._inferred_dtype = self._validate(data)
                           ^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\strings\accessor.py", line 245, in _validate
    raise AttributeError("Can only use .str accessor with string values!")
AttributeError: Can only use .str accessor with string values!. Did you mean: 'std'?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:13:12 | 显示全部楼层
凊风 发表于 2024-05-08 20:12
选择省级名称后,报错:
Traceback (most recent cal ...


非常抱歉,我之前的修改仍然存在问题。我深表歉意。

以下是经过修正的代码,请再次尝试:

  1. from PySide6.QtWidgets import QComboBox
  2. import pandas as pd

  3. def setup_area_selection(comboboxes, data_model):
  4.     levels = len(comboboxes)
  5.     df = pd.DataFrame(data_model)

  6.     def handle_combobox_change(index, level):
  7.         selected_code = comboboxes[level].currentData()
  8.         next_level = level + 1

  9.         for i in range(next_level, levels):
  10.             combobox = comboboxes[i]
  11.             combobox.clear()

  12.             filtered_data = df[df['区划代码'].str.startswith(selected_code) & (df['级别'] == i)]
  13.             names = filtered_data['名称'].tolist()
  14.             codes = filtered_data['区划代码'].tolist()

  15.             combobox.addItems(names)
  16.             combobox.setItemData(names.index(selected_code), codes[names.index(selected_code)])
  17.             combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_change(index, i))

  18.     comboboxes[0].currentIndexChanged.connect(lambda index: handle_combobox_change(index, 0))
复制代码


请注意,这段代码假设您的`data_model`数据是一个包含'级别'、'区划代码'和'名称'字段的字典列表。

如果还有任何问题,请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:15:33 | 显示全部楼层
FishC 发表于 2024-5-8 20:13
非常抱歉,我之前的修改仍然存在问题。我深表歉意。

以下是经过修正的代码,请再次尝试:

报错:
Traceback (most recent call last):
  line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
line 1125, in setup_area_selection
    df = pd.DataFrame(data_model)
         ^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\frame.py", line 875, in __init__
    raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:15:46 | 显示全部楼层
凊风 发表于 2024-05-08 20:15
报错:
Traceback (most recent call last):
  line ...


非常抱歉,我之前的修改仍然存在问题。让我们再次尝试并进行修复。

以下是经过修正的代码,请再次尝试:

from PySide6.QtWidgets import QComboBox
import pandas as pd

def setup_area_selection(comboboxes, data_file_path):
    df = pd.read_excel(data_file_path)
    level = len(comboboxes)

    for i in range(level):
        combobox = c

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:23:09 | 显示全部楼层
FishC 发表于 2024-5-8 20:15
非常抱歉,我之前的修改仍然存在问题。让我们再次尝试并进行修复。

以下是经过修正的代码,请再次尝 ...

能不能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位相同来筛选?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:23:28 | 显示全部楼层
凊风 发表于 2024-05-08 20:23
能不能self.combobox的数据通过level=1来显示;
然后 ...


当然可以!根据您的要求,以下是修改后的代码,按照级别进行过滤和筛选:

  1. from PySide6.QtWidgets import QComboBox
  2. import pandas as pd

  3. def setup_area_selection(comboboxes, data_model):
  4.     levels = len(comboboxes)
  5.     df = pd.DataFrame(data_model)
  6.    
  7.     def handle_combobox_change(index):
  8.         if index == levels - 1:
  9.             return

  10.         selected_code = comboboxes[index].currentData()
  11.         next_level = index + 2

  12.         filtered_data = df[df['区划代码'].str.startswith(selected_code)]
  13.         if index > 0:
  14.             prev_code = comboboxes[index-1].currentData()
  15.             filtered_data = filtered_data[filtered_data['区划代码'].str.startswith(prev_code[:len(prev_code)])]

  16.         level_combobox = comboboxes[next_level-1]
  17.         level_combobox.blockSignals(True)
  18.         level_combobox.clear()
  19.         level_combobox.addItem('请选择', None)
  20.         for i, row in filtered_data.iterrows():
  21.             level_combobox.addItem(row['名称'], row['区划代码'])
  22.         level_combobox.blockSignals(False)
  23.         
  24.     for i, combobox in enumerate(comboboxes):
  25.         if i == 0:
  26.             for _, row in df[df['级别'] == 1].iterrows():
  27.                 combobox.addItem(row['名称'], row['区划代码'])
  28.         else:
  29.             combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_change(i-1))
复制代码


请注意,我假设数据模型中存在名为 `'级别'`、`'区划代码'` 和 `'名称'` 的列,您可以根据实际的列名进行调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:27:03 | 显示全部楼层
FishC 发表于 2024-5-8 20:23
当然可以!根据您的要求,以下是修改后的代码,按照级别进行过滤和筛选:


这个报错是什么意思?
Traceback (most recent call last):
  line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1125, in setup_area_selection
    df = pd.DataFrame(data_model)
         ^^^^^^^^^^^^^^^^^^^^^^^^
line 875, in __init__
    raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:27:18 | 显示全部楼层
凊风 发表于 2024-05-08 20:27
这个报错是什么意思?
Traceback (most recent call  ...


这个错误意味着`pd.DataFrame()`构造函数没有正确调用。这通常是由于传递给构造函数的数据结构或参数不正确引起的。

根据您的反馈,看起来`data_model`的格式不符合`pd.DataFrame()`期望的格式。请确保`data_model`是一个可以转换为DataFrame的结构。

你可以尝试将`data_model`转换成一个列表或字典,然后再传递给`pd.DataFrame()`构造函数。以下是一个示例:

  1. df = pd.DataFrame(data_model)
复制代码


如果还遇到问题,请提供`data_model`的具体格式,我将尽力帮助您解决问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:30:19 | 显示全部楼层
FishC 发表于 2024-5-8 20:27
这个错误意味着`pd.DataFrame()`构造函数没有正确调用。这通常是由于传递给构造函数的数据结构或参数不 ...

data_model是不是指定路径下的工作簿?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:31:43 | 显示全部楼层
凊风 发表于 2024-05-08 20:30
data_model是不是指定路径下的工作簿?


是的,`data_model` 是指定路径下的工作簿,您可以使用 `pandas` 库来读取 Excel 文件并将其转换为 DataFrame。以下是相应的代码:

  1. import pandas as pd

  2. data_model = pd.read_excel("指定路径/工作簿.xlsx")
复制代码


请将 "指定路径/工作簿.xlsx" 替换为您的实际文件路径和文件名。这将会读取指定路径下的 Excel 文件并将其转换为 `data_model` DataFrame,供后续使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-8 20:31:50 | 显示全部楼层
FishC 发表于 2024-5-8 20:27
这个错误意味着`pd.DataFrame()`构造函数没有正确调用。这通常是由于传递给构造函数的数据结构或参数不 ...

我现在是这样写的:
file_path = self.folder_path + '/' + "行政区划代码库.xlsx"
self.Region_file = file_path
self.setup_area_selection(self.comboboxes, self.Region_file)

是不是这样调用setup_area_selection函数不可以?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 20:32:05 | 显示全部楼层
凊风 发表于 2024-05-08 20:31
我现在是这样写的:
file_path = self.folder_path + ...


是的,根据您当前的代码,`self.Region_file` 是一个文件路径字符串,而不是一个正确的数据模型对象。`setup_area_selection()` 函数需要接收一个数据模型对象作为参数,以便进一步处理和筛选数据。

您应该根据 `file_path` 的值,读取 Excel 文件并将其转换为数据模型对象,然后再调用 `setup_area_selection()` 函数。以下是修改后的代码:

  1. import pandas as pd

  2. file_path = self.folder_path + '/' + "行政区划代码库.xlsx"
  3. data_model = pd.read_excel(file_path)
  4. self.setup_area_selection(self.comboboxes, data_model)
复制代码


这样可以确保传递正确的数据模型对象给 `setup_area_selection()` 函数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 14:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表