鱼C论坛

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

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

  [复制链接]
 楼主| 发表于 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[df['区划代码'].astype(str).str[:code_length] == str(selected_code)[:code_length]]
                print('555filtered_data:', filtered_data)
            else:
                filtered_data = df[df['级别'] == current_level]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[df == current_level]` 来筛选数据,也请确保 `current_level` 的类型与 DataFrame 中的数据类型一致。

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[index]
            current_level = index + 1
            selected_code = ''

            # 获取上一级选择的区划代码
            if index > 0:
                previous_combobox = comboboxes[index - 1]
                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[df['区划代码'].astype(str).str[:code_length] == str(selected_code)[:code_length]]
                print('555filtered_data:', filtered_data)
            else:
                filtered_data = df[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[df['级别'] == current_level]
                       ^^^^^^^^^^^^^^^^^^^^^^^^^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]
    # 其他代码...

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

照这样修改代码后,弹窗“Python已停止工作”。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-9 12:45:07 | 显示全部楼层
凊风 发表于 2024-05-09 12:44
照这样修改代码后,弹窗“Python已停止工作”。。。。


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

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

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i]
            current_level = index + 1
            selected_code = ''

            # 获取上一级选择的区划代码
            if index > 0:
                previous_combobox = comboboxes[index - 1]
                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[df['区划代码'].astype(str).str[:code_length] == str(selected_code)[:code_length]]
                print('555filtered_data:', filtered_data)
            else:
                filtered_data = df[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已停止工作”。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[df.astype(str).str == str(selected_code)]` 这一行之前,添加一个判断条件,确认 `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[index]
        selected_code = ''

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

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

        # 更新当前级别的 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

仍然是弹窗“Python已停止工作”。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-9 12:51:24 | 显示全部楼层
凊风 发表于 2024-05-09 12:51
仍然是弹窗“Python已停止工作”。。。。


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i]
            current_level = i + 1
            selected_code = ''

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

            # 根据当前级别和区划代码进行筛选
            if selected_code:
                code_length = (i + 1) * 2
                filtered_data = df[df['区划代码'].astype(str).str[:code_length] == str(selected_code)[:code_length]]
            else:
                filtered_data = df[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位相同来筛选。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index]
        current_level = index + 1
        selected_code = ''

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

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

        # 更新当前级别的 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-9 12:58:54 | 显示全部楼层
FishC 发表于 2024-5-9 12:55
根据你的需求,可以使用以下代码实现筛选原则:

改成这样,会弹窗“Python已停止工作”。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-9 12:59:20 | 显示全部楼层
凊风 发表于 2024-05-09 12:58
改成这样,会弹窗“Python已停止工作”。。。。


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

1. `comboboxes`变量是一个列表,但在代码中使用时没有正确引用其中的元素。在循环中应该使用`comboboxes[i]`来访问每个`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[i]
        current_level = i + 1
        selected_code = ''

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

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

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

希望这次能帮助你解决问题,如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 20:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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