PyQt QInputDialog.getItem点击Cancel按钮程序崩溃问题如何解决
问题根因
你的代码触发UnboundLocalError有两个核心场景:
- 点击Cancel按钮时,
QInputDialog.getItem返回的ok值为False,if ok and item:包裹的代码块完全不执行,如果你后续在这个if块之外引用了link或dataset_name变量,这两个变量从未被赋值,直接触发未绑定局部变量错误。 - 即便点击OK选中了选项,要是遍历
datasets时没有匹配到和选中item一致的条目,link和dataset_name也不会被赋值,后续引用同样会报错。
修复方案
提前给变量设置默认初始值,同时补充变量有效性判断即可,修改后的代码参考:
query = "SELECT name FROM datasets" datasets = cur.execute(query).fetchall() items = () for dataset in datasets: items += dataset # 提前初始化后续要用到的变量,设置默认空值 link = None dataset_name = None item, ok = QInputDialog.getItem(self, "select input dialog", "list of languages", items, 0, False) if ok and item: query = "SELECT name, file FROM datasets" datasets = cur.execute(query).fetchall() for dataset in datasets: if dataset[0] == item: link = dataset[1] dataset_name = "Meno datasetu: " + str(dataset[0].split("-")[0]) # 后续所有依赖link、dataset_name的逻辑,必须先判断变量有效性再执行 if link and dataset_name: # 把原来用到link和dataset_name的业务代码放到这里 pass
你也可以把所有依赖link和dataset_name的逻辑全部放到if dataset[0] == item:的判断块内部,完全避免变量在未赋值的场景下被外部引用。
内容的提问来源于stack exchange,提问作者Radoslav Dugas
相关产品推荐
相关产品推荐

