gpt4 book ai didi

python - if/elif 混搭

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:37 28 4
gpt4 key购买 nike

这是我在此站点上的第二个问题,它们都处理未按预期工作的“if”语句。我已经学习 Python 大约 3-4 个月了,我记得刚开始学习“for”、“if”和“while”时,我记得我认为“if”语句是这三个语句中最简单的一个;我开始意识到“如果”语句并不像我曾经想的那么明确。

我正在编写一个转换器,它可以在不使用任何 Python 内置数学函数的情况下在二进制、十进制和十六进制之间进行转换。我正在使用 tkinter。

The problem I will ask about deals with when the convert from 'binary' radio button is selected.在 3 个“转换自”单选按钮下方是 3 个“转换为”复选框。如果选中 dec_bttn 复选框,则以下代码旨在将二进制转换为十进制,如果选中 hex_bttn 复选框,则将其转换为十六进制:

def from_binary(self, dec_bttn, hex_bttn):
""" Performs conversion from base2 to base10 and base16. """
bits = '1010' #actual code used -> self.input_str.get()
exp = len(bits) -1 #actual code used -> len(self.input_str.get()) - 1

# operate on valid string
# converts to decimal
if self.dec_bttn:
dtot = 0
while exp >= 1:
for i in bits[:-1]:
if i == "1":
dtot += 2**exp
elif i == "0":
dtot = dtot
exp -= 1

if bits[-1] == "1":
dtot += 1

self.output_disp.delete(0.0, END)
self.output_disp.insert(0.0, dtot)


# convert to hex

elif self.hex_bttn:
hex_digits = {
10: 'a', 11: 'b',
12: 'c', 13: 'd',
14: 'e', 15: 'f'
}
string_length = len(bits)
exp = len(bits) - 1
if string_length <= 4:
htot = 0
while exp >= 1:
for i in bits[:-1]:
if i == "1":
htot += 2**exp
elif i == "0":
htot = htot
exp -= 1

if bits[-1] == "1":
htot += 1

for i in hex_digits.keys():
if i == htot:
htot = hex_digits[i]
else:
htot = htot

self.output_disp.delete(0.0, END)
self.output_disp.insert(0.0, htot)

我已经发布了整个“from_binary”方法。这可能比需要的略多,但多一点总比忽略任何数量要好。

因为我最终必须将字符串分成半字节字符串以进行十六进制转换,所以它现在设置为 <= 4。所以我只使用 4 位字符串测试它。

就目前而言,无论选中哪个复选框,使用“elif self.hex_bttn”都会将二进制转换为十进制。如果我将其更改为“if self.hex_bttn”,那么无论选中哪个复选框,它都会转换为十六进制。

数学和一切工作正常并正确输出。正是这些“如果”语句的混合阻碍了我的进步。在我的初学者看来,这似乎是一个相当简单的测试,但我显然遗漏了一些东西。

如果有人能让我走上正确的道路,我将不胜感激。

祝福F.

最佳答案

if 语句和它的补充 elif,适用于 Boolean values .如果变量或正在测试的任何内容都不是 bool 值,那么它会被强制并以真/假方式理解。

任何非零且非空的对象都被解释为“真”。因此,假设 dec_bttnhex_bttn 是 Tkinter 复选框,然后 Python 正在检查复选框自身 的 bool 值,并在看到它们为真时继续执行第一个 if block 。 p>

在您的代码中的某处,您可能正在像这样初始化 Tkinter 复选框:

self.dec_bttn = Checkbutton(root, Text='To decimal', ... )
self.hex_bttn = Checkbutton(root, Text='To hex', ... )

不是像这样初始化它们,您需要有可以存储复选框“已选中”状态的变量,如下所示:

self.dec_checked = IntVar()
self.hex_checked = IntVar()

self.dec_bttn = Checkbutton(root, Text='To decimal',
variable=self.dec_checked, ... )
self.hex_bttn = Checkbutton(root, Text='To hex',
variable=self.hex_checked, ... )

注意 IntVar。那就是存储值的地方。但是,您不必使用 IntVar,您也可以使用 BooleanVar,或者任何其他 Tkinter 变量类型,事实上。

但是,我跑题了,我看到您已经在使用 BooleanVar。所以,其中大部分你已经知道了。但是,仅仅检查 self.dec_bttn 不起作用的原因是因为 dec_bttn 是一个对象,而不仅仅是一个简单的 bool 值。

if 语句中使用 self.dec_bttn.get() 检查复选框的状态。

查看 Tkinter reference对于与 Tkinter 变量类型关联的其他一些方法。

关于python - if/elif 混搭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147128/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com