凊风 发表于 2024-5-9 11:41:22

FishC 发表于 2024-5-9 11:37
非常抱歉,代码还是有问题。这里的错误在于使用 `df == current_level` 进行条件筛选。

应该使用 `d ...

我现在是这样的:
            if selected_code:
                code_length = (index + 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]

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

凊风 发表于 2024-05-09 11:41
我现在是这样的:
            if selected_code:
...

你的代码看起来正确,但是我注意到了一个小问题。在筛选数据时,你使用了 `df.astype(str).str == str(selected_code)` 这样的语句,其中 `selected_code` 应该是一个字符串类型的值。请确保 `selected_code` 是字符串类型,并且与 DataFrame 中的数据类型匹配。此外,如果你想要使用 `df` 来筛选数据,也请确保 `current_level` 的类型与 DataFrame 中的数据类型一致。

另外,请注意在筛选数据后打印 `filtered_data` 来确保筛选操作生效,并且确保 DataFrame 中确实存在与筛选条件匹配的数据。

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

凊风 发表于 2024-5-9 11:53:58

FishC 发表于 2024-5-9 11:41
你的代码看起来正确,但是我注意到了一个小问题。在筛选数据时,你使用了 `df.astype(str).str == str( ...

我现在代码是这样的:
    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 handle_combobox_changed(index):
            combobox = comboboxes
            current_level = index + 1
            selected_code = ''

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

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (index + 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)

      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)

然后报错:
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:54:10

凊风 发表于 2024-05-09 11:53
我现在代码是这样的:
    def setup_area_selection ...

我发现问题出在了这一行代码上:

combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(i))

这个错误是由于 Python 闭包的特性引起的。在循环中创建的 lambda 函数通过引用了 `i` 变量,但是实际上循环结束后,这个 `i` 变量的值已经被更新到最后一个索引上了。

要解决这个问题,你可以在 lambda 函数中使用参数传递 `i` 的值。修改如下:

combobox.currentIndexChanged.connect(lambda index, i=i: handle_combobox_changed(index, i))

然后修改 `handle_combobox_changed` 函数的定义,加入一个新的参数 `index`。

def handle_combobox_changed(index, i):
    combobox = comboboxes
    # 其他代码...

这样就能够正确地将当前的索引值传递给 `handle_combobox_changed` 函数了。希望对你有帮助!

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

凊风 发表于 2024-5-9 12:17:50

FishC 发表于 2024-5-9 11:54
我发现问题出在了这一行代码上:




报错:
Traceback (most recent call last):
line 1116, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1166, in setup_area_selection
    handle_combobox_changed(0)
TypeError: Region_Select_Window.setup_area_selection.<locals>.handle_combobox_changed() missing 1 required positional argument: 'i'

FishC 发表于 2024-5-9 12:18:04

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

这个错误是因为 `handle_combobox_changed` 函数需要一个参数 'i',但是在调用`handle_combobox_changed(0)`时没有传入此参数。为了解决这个问题,你可以尝试以下方法:

将 `handle_combobox_changed` 函数定义为一个嵌套函数,并将 `i` 作为参数传递给它。然后,通过使用 `functools.partial` 函数来连接信号和槽,这样就可以固定参数 'i' 的值。

from functools import partial

def setup_area_selection(self, comboboxes, data_model):
    # ...

    def handle_combobox_changed(i, index):
      # ...

    for i, combobox in enumerate(comboboxes):
      combobox.currentIndexChanged.connect(partial(handle_combobox_changed, i))

    # ...

这样修改之后,当 `currentIndexChanged` 信号触发时,它会调用 `handle_combobox_changed` 函数,并将 'i' 作为固定参数传递进去。这样就解决了缺少参数 'i' 的问题。

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

凊风 发表于 2024-5-9 12:23:41

FishC 发表于 2024-5-9 12:18
这个错误是因为 `handle_combobox_changed` 函数需要一个参数 'i',但是在调用`handle_combobox_change ...

报错:
Traceback (most recent call last):
   line 1117, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
line 1167, in setup_area_selection
    handle_combobox_changed(0)
TypeError: Region_Select_Window.setup_area_selection.<locals>.handle_combobox_changed() missing 1 required positional argument: 'index'

FishC 发表于 2024-5-9 12:23:55

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

这个错误是由于在调用 `handle_combobox_changed(0)` 时,缺少了一个必需的参数 'index'。

可以通过修改代码来解决这个问题。将 `handle_combobox_changed` 函数的定义改为接收两个参数,一个是 'index',一个是 'i'。然后在连接信号和槽时,使用 `functools.partial` 函数来传递参数。

具体的代码修改如下:
import functools

# ...

def handle_combobox_changed(index, i):
    # ...

for i, combobox in enumerate(comboboxes):
    combobox.currentIndexChanged.connect(functools.partial(handle_combobox_changed, i))

# ...

这样应该可以解决参数缺失的问题。请尝试一下。

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

凊风 发表于 2024-5-9 12:41:35

FishC 发表于 2024-5-9 12:23
这个错误是由于在调用 `handle_combobox_changed(0)` 时,缺少了一个必需的参数 'index'。

可以通过 ...

仍然报错差参数:
Traceback (most recent call last):
line 1118, in select_folder
    self.setup_area_selection(self.comboboxes, self.Region_file)
   line 1168, in setup_area_selection
    handle_combobox_changed(0)
TypeError: Region_Select_Window.setup_area_selection.<locals>.handle_combobox_changed() missing 1 required positional argument: 'i'

FishC 发表于 2024-5-9 12:41:49

凊风 发表于 2024-05-09 12:41
仍然报错差参数:
Traceback (most recent call last ...

很抱歉,我之前的回答有误。看起来你的问题是由于 `handle_combobox_changed()` 函数需要一个参数 'i',但在调用时没有提供。

你可以尝试将 `handle_combobox_changed(0)` 改为 `handle_combobox_changed(0, i)`,其中 `i` 是你希望传递给函数的值。这样应该能解决这个错误。

如果问题仍然存在,请提供相关的源代码,以便更好地帮助您解决问题。

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

凊风 发表于 2024-5-9 12:44:45

FishC 发表于 2024-5-9 12:41
很抱歉,我之前的回答有误。看起来你的问题是由于 `handle_combobox_changed()` 函数需要一个参数 'i' ...

照这样修改代码后,弹窗“Python已停止工作”。。。。

FishC 发表于 2024-5-9 12:45:07

凊风 发表于 2024-05-09 12:44
照这样修改代码后,弹窗“Python已停止工作”。。。。

抱歉,有可能是代码中其他的问题导致了弹窗“Python已停止工作”错误。要解决这个问题,我们需要检查你的代码,并尝试找到出错的部分。以下是一些常见的导致程序崩溃的问题:

1. 内存溢出:如果程序操作了大量的数据或循环次数过多,可能会导致内存溢出。在这种情况下,可以尝试对代码进行优化,减少内存使用量或者增加内存限制。

2. 死循环:如果代码中存在死循环,那么程序将无法终止并最终导致崩溃。请确保你的代码中不存在无限循环。

3. 异常处理:如果你的代码中没有适当地处理异常,特别是在用户输入方面,可能会导致程序崩溃。请确保适当地使用 try-except 块来捕获和处理异常情况。

4. 第三方库的问题:如果你的代码依赖于某个第三方库,那么请确保你已经正确安装并使用了最新的版本。

综上所述,我建议你逐步分析代码,尝试定位并解决问题。你可以在代码的关键部分添加调试信息,运行程序以查看每个步骤的输出,以便更好地理解程序执行时的情况。另外,你也可以使用 Python 自带的调试器(如 pdb)来帮助你查找问题所在。

如果你能提供更多的代码细节或完整的错误信息,我将能够更好地帮助你找到解决方案。

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

凊风 发表于 2024-5-9 12:48:04

FishC 发表于 2024-5-9 12:45
抱歉,有可能是代码中其他的问题导致了弹窗“Python已停止工作”错误。要解决这个问题,我们需要检查你 ...

现有代码是这样的:
    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 handle_combobox_changed(index, i):
            combobox = comboboxes
            current_level = index + 1
            selected_code = ''

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

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (index + 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)

      for i, combobox in enumerate(comboboxes):
            combobox.currentIndexChanged.connect(functools.partial(handle_combobox_changed, i))

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

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

然后弹窗“Python已停止工作”。。。

FishC 发表于 2024-5-9 12:48:24

凊风 发表于 2024-05-09 12:48
现有代码是这样的:
    def setup_area_selection(s ...

根据你提供的代码,我注意到有几个地方可能引发了“Python已停止工作”的错误。请尝试按照以下方式进行修改:

1. 检查导入的模块是否正确,确保需要的库已经正确安装。
2. 检查 `self.Region_file` 的路径是否正确,并确保文件存在。
3. 在 `handle_combobox_changed()` 函数中,将 `comboboxes` 修改为 `combobox`,并删除 `current_level` 变量。因为在函数内部使用了 `enumerate(comboboxes)`,所以你只需要使用一个 `combobox` 变量即可。
4. 在 `filtered_data = df` 这一行之前,添加一个判断条件,确认 `selected_code` 不为空才进行筛选。

修改后的代码如下所示:

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 handle_combobox_changed(index, i):
      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 == str(selected_code)]
      else:
            filtered_data = df

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

    for i, combobox in enumerate(comboboxes):
      combobox.currentIndexChanged.connect(functools.partial(handle_combobox_changed, i))

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

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

希望这次能够解决问题。如果问题仍然存在,请提供相关的错误信息以便我更进一步帮助你。

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

凊风 发表于 2024-5-9 12:51:15

FishC 发表于 2024-5-9 12:48
根据你提供的代码,我注意到有几个地方可能引发了“Python已停止工作”的错误。请尝试按照以下方式进行 ...

仍然是弹窗“Python已停止工作”。。。。

FishC 发表于 2024-5-9 12:51:24

凊风 发表于 2024-05-09 12:51
仍然是弹窗“Python已停止工作”。。。。

非常抱歉听到你仍然遇到问题。"Python已停止工作"通常是由于代码中的错误导致的。为了更好地帮助你,我需要看到完整的代码和错误提示。可以将完整的代码和错误消息提供给我吗?这样我才能更准确地找到问题所在并给出解决方案。

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

凊风 发表于 2024-5-9 12:55:02

FishC 发表于 2024-5-9 12:51
非常抱歉听到你仍然遇到问题。"Python已停止工作"通常是由于代码中的错误导致的。为了更好地帮助你,我 ...

如果代码换成这样:
    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)

是能够正常刷新出来所有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-9 12:55:17

凊风 发表于 2024-05-09 12:55
如果代码换成这样:
    def setup_area_selection(s ...

根据你的需求,可以使用以下代码实现筛选原则:

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 handle_combobox_changed(index, i):
      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

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

    for i, combobox in enumerate(comboboxes):
      combobox.currentIndexChanged.connect(functools.partial(handle_combobox_changed, i))

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

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

此代码会根据每个下拉框前面的下拉框的选择来筛选数据,并更新当前下拉框的内容。确保你已经正确定义了 `self.combobox`, `self.combobox_2`, `self.combobox_3`等控件,并将它们传递给 `setup_area_selection` 函数。

希望这可以解决你的问题,如果还有其他疑问,请随时提问!

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

凊风 发表于 2024-5-9 12:58:54

FishC 发表于 2024-5-9 12:55
根据你的需求,可以使用以下代码实现筛选原则:




改成这样,会弹窗“Python已停止工作”。。。。

FishC 发表于 2024-5-9 12:59:20

凊风 发表于 2024-05-09 12:58
改成这样,会弹窗“Python已停止工作”。。。。

非常抱歉让你遇到这个问题。根据你提供的代码,我注意到有几个可能导致程序崩溃的问题:

1. `comboboxes`变量是一个列表,但在代码中使用时没有正确引用其中的元素。在循环中应该使用`comboboxes`来访问每个`QComboBox`对象。

2. 在筛选数据时,应该使用`.str.startswith()`方法来检查字符串的前缀匹配,而不是用`==`进行比较。

请尝试使用以下修正后的代码:

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
      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 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 3 4 5 [6] 7 8 9 10 11 12
查看完整版本: 资产管理系统求教~~