RT

涉案代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#这是一个用于显示菜单,并进行选择的代码

def choose(
title: str,
options: tuple | list,
console: "ColorfulConsole",
separate=None) -> str:
screen = f"{title}:\n"
row = 0
for i, j in enumerate(options, start=1):
screen += f"{i: >2d}. {j}\n"
if separate and row in separate:
screen += f"{'=' * 25}\n"
row += 1
return console.input(screen)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#  这是菜单选择功能代码

def run(self, default_mode: list):
self.default_mode = default_mode
with suppress(ValueError):
while self.running:
if not (select := safe_pop(self.default_mode)):


select = choose(
"请选择采集功能",
[i for i, _ in self.__function],
self.console)

# select=5
# print(select)



if select in {"Q", "q"}:
self.running = False
elif not select:
break
elif (n := int(select) - 1) in range(len(self.__function)):
self.__function[n][1](safe_pop(self.default_mode))

当我在控制台输入数字时,功能是可以正常调用的,但是在直接给 select变量赋值时功能执行不正常。

后来发现是 整数与字符串的原因

在使用 choose() 函数时,用户通过控制台进行输入,返回值是一个字符串。例如,如果用户输入 5select 就是字符串 "5"。之后,代码会将 select 转换为整数并进行判断。

直接赋值的是一个整数,而不是字符串。如果不再通过控制台输入,代码依然会执行 int(select) 转换,但是这里的 select 已经是整数了,继续转换时会报错,因为 int() 函数需要处理字符串,而非整数。这是为什么功能无法正常执行的原因

解决方案

1.如果直接赋值给 select,应该确保跳过 int() 转换部分,或者直接处理整数。

2.即使手动赋值给 select,确保它是字符串形式:

1
select = "5"

后来发现根本不是整数与字符串的问题,很莫名其妙,后来在菜单选择之前加了一个sleep后,功能就正常了= =
有点玄学

    def run(self, default_mode: list):
        self.default_mode = default_mode
        with suppress(ValueError):
            while self.running:
                if not (select := safe_pop(self.default_mode)):
                    select = choose(
                        "请选择采集功能",
                        [i for i, _ in self.__function],
                        self.console)
                    # select=5
                    # print(select)
                if select in {"Q", "q"}:
                    self.running = False
                elif not select:
                    break
                elif (n := int(select) - 1) in range(len(self.__function)):
                    
                    time.sleep(0.5)
                    
                    self.__function[n][1](safe_pop(self.default_mode))