You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理存档文件时触发TypeError:无法解包不可迭代布尔对象求助

错误排查与解决:TypeError: cannot unpack non-iterable bool object

错误信息

>  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\tkinter\__init__.py", line 1967, in __call__
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "d:\source\BBSaveEditorFix\app.py", line 291, in _process_data_user
    self.data, self.user = process_user(self.file_location)
    ^^^^^^^^^^^^^^^^^^^^
TypeError: cannot unpack non-iterable bool object

相关代码

app.py中_process_data_user相关代码

def _load_all_gems(self):
    if self.gems is None:
        messagebox.showwarning("File not loaded!", "You can not reset all modifications since no file is loaded")
        return
    self.combobox_all_gems['values'] = [list(gem.get_original_stats())[0] for gem in self.gems]

def _set_original_gem_stats(self, e=None):
    if e is not None:
        for gem in self.gems:
            if list(gem.get_original_stats())[0] == e.widget.get():
                self.selected_gem = gem
    for i, (gem_menu, value) in enumerate(zip(self.all_gem_menu, list(self.selected_gem.get_original_stats()))):
        if i > 2:
            gem_menu.set(value)
        else:
            gem_menu.config(state="normal")
            gem_menu.delete(0, END)
            gem_menu.insert(INSERT, value)
            gem_menu.config(state="disabled")

def _process_data_user(self):
    if self.file_location is None:
        messagebox.showwarning("User not loaded!", "No file selected")
    self.data, self.user = process_user(self.file_location)
    self._set_original_users_stats()

def _process_data_gems(self):
    if self.file_location is None:
        messagebox.showwarning("File not loaded!", "No file selected")
    self.data, self.gems = process_gems(self.file_location)
    self._load_all_gems()

def _open_file_selection(self):
    self.file_location = filedialog.askopenfilename(initialdir="./")
    self.file_loc_ent.config(state="normal")
    self.file_loc_ent.delete(0, END)
    self.file_loc_ent.insert(INSERT, self.file_location)
    self.file_loc_ent.config(state="disabled")

process_user与process_gems相关代码

def proecess_user(filename: str):
    data = None
    with open(filename, "rb") as f:
        data = f.read()
    hexdata = binascii.hexlify(data)
    if not data.startswith(b"41000000000000"):
        return False
    return data, extract_user_info(data) 


def process_gems(filename: str):
    data = None
    with open(filename, "rb") as f:
        data = f.read()
    data = binascii.hexlify(data)
    if not data.startswith(b"41000000000000"):
        return False
    return data, extract_gems(data)

问题根源

  1. 返回值类型不一致:文件格式验证失败时返回单个布尔值False,验证成功时返回(data, 结果对象)元组。调用处试图将返回值解包给两个变量,布尔值不可迭代,直接触发TypeError。
  2. 函数拼写错误:定义的函数名是proecess_user(多了一个字母'e'),但调用时使用process_user,会导致函数无法正确匹配(若未触发NameError,说明是代码复制时的笔误,但实际运行中会引发逻辑错误)。
  3. 错误分支未终止执行:_process_data_user和_process_data_gems中,当self.file_location为None时,弹出警告后未终止函数,后续依然会调用处理函数,传入None会引发文件读取错误或验证失败返回False,最终触发解包错误。

解决方法

1. 统一函数返回值类型

将验证失败的返回值改为可迭代的(None, None),保证与成功返回值结构一致:

def process_user(filename: str):
    data = None
    with open(filename, "rb") as f:
        data = f.read()
    # 移除未使用的hexdata变量
    if not data.startswith(b"\x41\x00\x00\x00\x00\x00\x00"):
        return None, None
    return data, extract_user_info(data) 


def process_gems(filename: str):
    data = None
    with open(filename, "rb") as f:
        data = f.read()
    hex_data = binascii.hexlify(data)
    if not hex_data.startswith(b"41000000000000"):
        return None, None
    return hex_data, extract_gems(hex_data)

注:process_gems中重命名了转换后的变量,避免覆盖原始二进制数据,同时修正验证逻辑的匹配对象。

2. 修正函数拼写错误

将proecess_user改为process_user,确保函数定义与调用名称完全一致。

3. 完善错误分支逻辑

在弹出警告后立即终止函数执行,并新增无效文件的判断提示:

def _process_data_user(self):
    if self.file_location is None:
        messagebox.showwarning("User not loaded!", "No file selected")
        return
    self.data, self.user = process_user(self.file_location)
    if self.data is None or self.user is None:
        messagebox.showerror("Invalid File", "Selected file is not a valid user save file")
        return
    self._set_original_users_stats()

def _process_data_gems(self):
    if self.file_location is None:
        messagebox.showwarning("File not loaded!", "No file selected")
        return
    self.data, self.gems = process_gems(self.file_location)
    if self.data is None or self.gems is None:
        messagebox.showerror("Invalid File", "Selected file is not a valid gems save file")
        return
    self._load_all_gems()

内容的提问来源于stack exchange,提问作者noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:35:12