凊风 发表于 2024-5-9 13:02:31

FishC 发表于 2024-5-9 12:59
非常抱歉让你遇到这个问题。根据你提供的代码,我注意到有几个可能导致程序崩溃的问题:

1. `combob ...

报错:
Traceback (most recent call last):
   line 1118, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1153, in setup_area_selection
    combobox.addItem(name, code)
TypeError: 'PySide6.QtWidgets.QComboBox.addItem' called with wrong argument types:
PySide6.QtWidgets.QComboBox.addItem(Series, Series)
Supported signatures:
PySide6.QtWidgets.QComboBox.addItem(Union, str, Any = Invalid(typing.Any))
PySide6.QtWidgets.QComboBox.addItem(str, Any = Invalid(typing.Any))

FishC 发表于 2024-5-9 13:02:47

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

这个错误提示表明在调用`combobox.addItem(name, code)`时,输入的参数类型不正确。根据报错信息,`name`和`code`应该是`Series`类型。

这里需要注意的是,`filtered_data.iterrows()`返回的是每一行的索引和数据的元组,而不是单个的值。为了解决这个问题,可以将`row`改成`row['name']`和`row['code']`来获取具体的值。

修改后的代码如下:

for index, row in filtered_data.iterrows():
    name = row['name']
    code = row['code']
    combobox.addItem(str(name), str(code))

请尝试运行这段代码,并确认`filtered_data`中确实存在名为`name`和`code`的列。如果列名不同,请根据实际情况进行修改。

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

凊风 发表于 2024-5-9 13:05:41

FishC 发表于 2024-5-9 13:02
这个错误提示表明在调用`combobox.addItem(name, code)`时,输入的参数类型不正确。根据报错信息,`nam ...

报错:
Traceback (most recent call last):
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\indexes\base.py", line 3805, in get_loc
    return self._engine.get_loc(casted_key)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "index.pyx", line 167, in pandas._libs.index.IndexEngine.get_loc
File "index.pyx", line 196, in pandas._libs.index.IndexEngine.get_loc
File "pandas\\_libs\\hashtable_class_helper.pxi", line 7081, in pandas._libs.hashtable.PyObjectHashTable.get_item
File "pandas\\_libs\\hashtable_class_helper.pxi", line 7089, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'name'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
   line 1118, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1151, in setup_area_selection
    name = row['name']
         ~~~^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\series.py", line 1112, in __getitem__
    return self._get_value(key)
         ^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\series.py", line 1228, in _get_value
    loc = self.index.get_loc(label)
          ^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\PycharmProjects\pythonProject\.venv\Lib\site-packages\pandas\core\indexes\base.py", line 3812, in get_loc
    raise KeyError(key) from err
KeyError: 'name'

FishC 发表于 2024-5-9 13:06:52

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

这个错误提示表明在获取某一行数据时出现了键错误。`KeyError: 'name'`说明在DataFrame中找不到名为'name'的列。

建议你仔细检查一下你的数据表中的列名是否正确。请确保所有列名与代码中使用的列名完全一致,包括大小写。

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

凊风 发表于 2024-5-10 06:12:47

FishC 发表于 2024-5-9 13:06
这个错误提示表明在获取某一行数据时出现了键错误。`KeyError: 'name'`说明在DataFrame中找不到名为'na ...

现有代码如下 :
self.comboboxes =

    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.setup_area_selection(self.comboboxes, self.Region_file)

执行后所有combobox都能加载相应层级的数据。

现在的需求是要实现如下筛选原则:

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-10 06:14:04

凊风 发表于 2024-05-10 06:12
现有代码如下 :
self.comboboxes =

    def set ...

可以根据您的需求进行相应的修改来实现筛选原则。以下是可能的实现方式:

1. 首先,在`setup_area_selection`方法中,传入一个表示当前层级的参数`current_level`。

2. 在更新当前级别的QComboBox之前,根据当前层级和前一级的选择进行数据筛选。

3. 修改代码如下:

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

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

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

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

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

# 在设置第一级combobox的数据时调用
self.setup_area_selection(self.comboboxes, self.Region_file, 1)

# 在每次选中上一级combobox后,设置下一级combobox的数据调用
self.setup_area_selection(self.comboboxes, self.Region_file, current_level + 1)

请注意,根据您提供的代码片段,我假设您的data_model中有一个名为'level'的列来表示层级。如果不是这样,请将代码中的'level'改为您的数据模型中对应的列名。此外,还假设每个combobox在self.comboboxes列表中的顺序与层级的对应关系一致。

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

凊风 发表于 2024-5-10 06:18:41

FishC 发表于 2024-5-10 06:14
可以根据您的需求进行相应的修改来实现筛选原则。以下是可能的实现方式:

1. 首先,在`setup_area_s ...

请问这两句代码要放在哪个位置?
# 在设置第一级combobox的数据时调用
self.setup_area_selection(self.comboboxes, self.Region_file, 1)

# 在每次选中上一级combobox后,设置下一级combobox的数据调用
self.setup_area_selection(self.comboboxes, self.Region_file, current_level + 1)

FishC 发表于 2024-5-10 06:18:50

凊风 发表于 2024-05-10 06:18
请问这两句代码要放在哪个位置?
# 在设置第一级comb ...

这两句代码需要放在以下位置:

1. 设置第一级combobox的数据时调用:
   在你的代码中,找到设置第一级combobox数据的位置,并将第一句代码放在那里。假设你的设置第一级combobox数据的代码是`self.combobox.addItems(items)`,那么修改后的代码应该是:
   self.combobox.addItems(items)
   self.setup_area_selection(self.comboboxes, self.Region_file, 1)

2. 每次选中上一级combobox后,设置下一级combobox的数据时调用:
   在你的代码中,找到每次选中上一级combobox后设置下一级combobox数据的位置,并将第二句代码放在那里。假设你通过信号槽或事件绑定来触发下一级combobox数据的更新,那么修改后的代码应该是:
   # 通过信号槽或事件绑定来触发下一级combobox数据的更新
   self.setup_area_selection(self.comboboxes, self.Region_file, current_level + 1)

请注意,`current_level`是一个变量,可能需要根据实际情况进行调整。

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

凊风 发表于 2024-5-10 06:23:11

FishC 发表于 2024-5-10 06:18
这两句代码需要放在以下位置:

1. 设置第一级combobox的数据时调用:


能不能把这两句代码集成在setup_area_selection函数中?

FishC 发表于 2024-5-10 06:24:26

凊风 发表于 2024-05-10 06:23
能不能把这两句代码集成在setup_area_selection函数中 ...

当然可以将这两句代码集成在`setup_area_selection`函数中。以下是修改后的代码示例:

def setup_area_selection(self, comboboxes, data_model, current_level=None):
    levels = len(comboboxes)
    df = pd.read_excel(data_model)
   
    if current_level is None:
      current_level = 1

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

      # 获取上一级选择的区划代码
      if i > 0:
            previous_combobox = comboboxes
            selected_code = previous_combobox.currentData()
      
      # 根据当前级别和区划代码进行筛选
      if selected_code:
            code_length = (i + 1) * 2
            filtered_data = df
      else:
            filtered_data = df

      # 更新当前级别的 QComboBox
      combobox.clear()
      combobox.addItem("请选择")
      for index, row in filtered_data.iterrows():
            name = row
            code = row
            combobox.addItem(name, code)

# 在设置第一级combobox的数据时调用
self.setup_area_selection(self.comboboxes, self.Region_file, 1)

# 在每次选中上一级combobox后,设置下一级combobox的数据调用
self.setup_area_selection(self.comboboxes, self.Region_file, current_level + 1)

通过将`current_level`作为参数传递给`setup_area_selection`函数,您可以根据需要在不同的位置来调用函数,并设置相应的当前级别。

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

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

FishC 发表于 2024-5-10 06:24
当然可以将这两句代码集成在`setup_area_selection`函数中。以下是修改后的代码示例:




能不能把self.combobox、self.combobox_2....self.combobox_5的数据加载代码分开来写从而实现如下筛选原则:
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-10 10:10:13

凊风 发表于 2024-05-10 10:10
能不能把self.combobox、self.combobox_2....self.com ...

当然可以实现这个筛选原则。以下是修改后的代码示例:

def load_combobox_data(self):
    self.load_level_1_data()

def load_level_1_data(self):
    # 根据 level=1 的筛选条件,加载 self.combobox 的数据
    # code...

    # 加载下一级数据
    self.load_level_2_data()

def load_level_2_data(self):
    # 根据 self.combobox 的区划代码前2位相同的筛选条件,加载 self.combobox_2 的数据
    # code...

    # 加载下一级数据
    self.load_level_3_data()

def load_level_3_data(self):
    # 根据 self.combobox_2 的区划代码前4位相同的筛选条件,加载 self.combobox_3 的数据
    # code...

    # 加载下一级数据
    self.load_level_4_data()

def load_level_4_data(self):
    # 根据 self.combobox_3 的区划代码前6位相同的筛选条件,加载 self.combobox_4 的数据
    # code...

    # 加载下一级数据
    self.load_level_5_data()

def load_level_5_data(self):
    # 根据 self.combobox_4 的区划代码前9位相同的筛选条件,加载 self.combobox_5 的数据
    # code...

你可以根据自己的具体需求,在相应的加载数据函数内部编写适当的筛选条件和加载逻辑。

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

凊风 发表于 2024-5-10 10:12:47

FishC 发表于 2024-5-10 10:10
当然可以实现这个筛选原则。以下是修改后的代码示例:




现有代码如下:
self.comboboxes =
self.setup_area_selection(self.comboboxes, self.Region_file)

    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、self.combobox_2....self.combobox_5的数据加载代码分开来写从而实现如下筛选原则:
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-10 10:13:04

凊风 发表于 2024-05-10 10:12
现有代码如下:
self.comboboxes =
self.setup_are ...

可以将代码进行相应的修改以实现你的筛选原则。以下是修改后的代码示例:

def load_combobox_data(self):
    self.setup_combobox_level1()
   
def setup_combobox_level1(self):
    self.combobox_1.clear()
    self.combobox_1.addItem("请选择")
   
    filtered_data = self.data_model == 1]
   
    for index, row in filtered_data.iterrows():
      name = row['name']
      code = row['code']
      self.combobox_1.addItem(name, code)
      
def setup_combobox_level2(self, selected_code):
    self.combobox_2.clear()
    self.combobox_2.addItem("请选择")
   
    filtered_data = self.data_model.str[:2] == selected_code[:2]]
   
    for index, row in filtered_data.iterrows():
      name = row['name']
      code = row['code']
      self.combobox_2.addItem(name, code)
      
def setup_combobox_level3(self, selected_code):
    self.combobox_3.clear()
    self.combobox_3.addItem("请选择")
   
    filtered_data = self.data_model.str[:4] == selected_code[:4]]
   
    for index, row in filtered_data.iterrows():
      name = row['name']
      code = row['code']
      self.combobox_3.addItem(name, code)
      
def setup_combobox_level4(self, selected_code):
    self.combobox_4.clear()
    self.combobox_4.addItem("请选择")
   
    filtered_data = self.data_model.str[:6] == selected_code[:6]]
   
    for index, row in filtered_data.iterrows():
      name = row['name']
      code = row['code']
      self.combobox_4.addItem(name, code)
      
def setup_combobox_level5(self, selected_code):
    self.combobox_5.clear()
    self.combobox_5.addItem("请选择")
   
    filtered_data = self.data_model.str[:9] == selected_code[:9]]
   
    for index, row in filtered_data.iterrows():
      name = row['name']
      code = row['code']
      self.combobox_5.addItem(name, code)

然后在`setup_area_selection`函数中调用这些新的函数来加载数据:

def setup_area_selection(self, comboboxes, data_model):
    self.data_model = pd.read_excel(self.Region_file)

    # ...
    # 这里省略了其他部分代码
   
    self.setup_combobox_level1()
    self.combobox_1.currentIndexChanged.connect(lambda: self.setup_combobox_level2(self.combobox_1.currentData()))
    self.combobox_2.currentIndexChanged.connect(lambda: self.setup_combobox_level3(self.combobox_2.currentData()))
    self.combobox_3.currentIndexChanged.connect(lambda: self.setup_combobox_level4(self.combobox_3.currentData()))
    self.combobox_4.currentIndexChanged.connect(lambda: self.setup_combobox_level5(self.combobox_4.currentData()))

通过这样的修改,你可以根据不同的级别和区划代码进行筛选并加载相应的数据到不同的QComboBox中。

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

凊风 发表于 2024-5-10 11:39:41

FishC 发表于 2024-5-10 10:13
可以将代码进行相应的修改以实现你的筛选原则。以下是修改后的代码示例:




感觉行数太多了,能不能整合成一个函数?

FishC 发表于 2024-5-10 11:39:57

凊风 发表于 2024-05-10 11:39
感觉行数太多了,能不能整合成一个函数?

当然可以整合成一个函数来简化代码。以下是整合后的代码示例:

def setup_area_selection(self, comboboxes, data_model):
    levels = len(comboboxes)
    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)]
      else:
            filtered_data = df == current_level]

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

这样,你只需要调用 `setup_area_selection(self.comboboxes, self.Region_file)` 就能实现你描述的筛选原则,并将数据加载到对应的 QComboBox 中。注意,假设 `comboboxes` 是一个包含了 `self.combobox` 到 `self.combobox_5` 的列表。在代码中,我还添加了一个名为 `level` 的列,用于标识每行数据的级别(1、2、3...)。在你的实际数据中,你可能需要对应修改或提供一个合适的标识列。

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

凊风 发表于 2024-5-10 11:48:59

FishC 发表于 2024-5-10 11:39
当然可以整合成一个函数来简化代码。以下是整合后的代码示例:




我现在的需求是当self.combobox点击后,

再加载符合level=2 并且 区划代码=self.combobox的区划代码前2位的数据到self.combobox_2;

当self.combobox_2点击后,
再加载符合level=3 并且 区划代码=self.combobox_2的区划代码前4位的数据到self.combobox_3;

当self.combobox_3点击后,
再加载符合level=4 并且 区划代码=self.combobox_3的区划代码前6位的数据到self.combobox_4;

当self.combobox_4点击后,
再加载符合level=5 并且 区划代码=self.combobox_4的区划代码前9位的数据到self.combobox_5。

FishC 发表于 2024-5-10 11:49:21

凊风 发表于 2024-05-10 11:48
我现在的需求是当self.combobox点击后,

再加载符 ...

以下是根据你的需求编写的代码示例:

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

    def refresh_combobox(current_combobox, selected_code):
      current_level = comboboxes.index(current_combobox) + 1
      code_length = current_level * 2
      filtered_data = df.str[:code_length] == selected_code]
      current_combobox.clear()
      current_combobox.addItem("请选择")
      for index, row in filtered_data.iterrows():
            name = row['名称']
            code = row['区划代码']
            current_combobox.addItem(name, code)

    for i in range(levels):
      current_combobox = comboboxes
      if i == 0:
            refresh_combobox(current_combobox, '')
      else:
            previous_combobox = comboboxes
            previous_combobox.currentIndexChanged.connect(lambda: refresh_combobox(current_combobox, previous_combobox.currentData()))


在这个函数中,我们首先定义了一个嵌套函数`refresh_combobox`,用于刷新下一个级别的`combobox`。然后,在主循环中,我们逐个处理每个`combobox`,如果当前级别为第一个,即`i==0`,则直接刷新该`combobox`;否则,将前一个`combobox`的`currentIndexChanged`信号与`refresh_combobox`函数连接,以便在前一个`combobox`选择项改变时刷新当前级别的`combobox`。

希望这能满足你的需求!

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

凊风 发表于 2024-5-10 13:12:01

FishC 发表于 2024-5-10 11:49
以下是根据你的需求编写的代码示例:




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!

FishC 发表于 2024-5-10 13:12:30

凊风 发表于 2024-05-10 13:12
Traceback (most recent call last):
line 1116, i ...

这个错误通常是由于`DataFrame`构造函数参数不正确引起的。请确保`data_model`是一个合法的数据列表或字典。

以下是修改后的代码示例:

def setup_area_selection(self, comboboxes, data_model):
    self.comboBox.currentIndexChanged.connect(lambda: self.load_combobox_data(2, self.comboBox.currentText(), comboboxes, data_model))
    self.comboBox_2.currentIndexChanged.connect(lambda: self.load_combobox_data(3, self.comboBox_2.currentText(), comboboxes, data_model))
    self.comboBox_3.currentIndexChanged.connect(lambda: self.load_combobox_data(4, self.comboBox_3.currentText(), comboboxes, data_model))
    self.comboBox_4.currentIndexChanged.connect(lambda: self.load_combobox_data(5, self.comboBox_4.currentText(), comboboxes, data_model))

def load_combobox_data(self, level, parent_code, combobox, data_model):
    # 根据条件筛选数据
    filtered_data = == level and item['区划代码'].startswith(parent_code)]
   
    # 加载筛选后的数据到下拉框
    combobox.clear()
    combobox.addItems( for item in filtered_data])

这里使用`load_combobox_data`函数来加载符合条件的数据到下拉框,并将其与相应的`currentIndexChanged`信号绑定起来。

请确保`data_model`参数是一个包含字典的列表,每个字典表示一个数据项。如果你的数据模型不一样,请适当修改代码中的字段名和条件判断。

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