这是我在这个网站上的第二个问题,他们都处理'if'语句没有按预期工作。 我已经学习了大约3-4个月的Python,我记得在开始的时候我正在学习'for','if'和'而我记得'if'语句是三个中最简单的一个;我开始认识到'如果'陈述并不像我曾经想象的那样明确。
我正在编写一个转换器,可以在二进制,十进制和十六进制之间进行转换,而无需使用任何Python内置的数学函数。我正在使用tkinter。
我将询问有关何时选择“二进制”单选按钮转换的问题。低于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'方法。这可能比需要的稍微多一些,但是太多太多比忽略任何数量都要好。
因为我必须最终将字符串分解为半字节转换的半字节字符串,所以它现在设置为&lt; = 4.所以我只使用4位字符串测试它。
就目前而言,使用'elif self.hex_bttn'它会将二进制转换为十进制,而不管选择哪个复选框。 如果我将其更改为'if self.hex_bttn',则无论选择哪个复选框,它都会转换为十六进制。
数学和一切正常并输出正确。它只是混淆了这些“if”语句阻碍了我的进步。 对我的初学者来说,这似乎是一个相当简单的测试,但我显然错过了一些东西。
如果有人能让我走上正确的道路,我将不胜感激。
祝福 F。
答案 0 :(得分:6)
if
语句及其补码elif
适用于Boolean values。如果变量或正在测试的任何变量已经不是布尔值,则强制并以真/假的方式理解。
任何非零且非空的对象都被解释为“True”。因此,假设dec_bttn
和hex_bttn
是Tkinter复选框,那么Python正在检查复选框本身的布尔值,并且看到它们为真,每次都会执行第一个if
块。
在代码中的某处,您可能正在初始化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
是一个对象,而不仅仅是一个简单的布尔值。
在self.dec_bttn.get()
语句中使用if
来检查复选框的状态。
查看Tkinter reference以了解与Tkinter变量类型相关的其他一些方法。
答案 1 :(得分:1)
听起来你self.dec_bttn
和self.hex_bttn
评估为真,可能是因为,正如@voithos所说,你应该.get()
来自对象的值。
这是一个完全可用的二进制字符串到数字转换器:
def binary_to_number(binary_string):
total = 0
for c in binary_string:
total = total * 2 + (c == "1")
return total
然后您的代码可能是这样的:
def binary_to_number(binary_string):
total = 0
for c in binary_string:
total = total * 2 + (c == "1")
return total
def binary_to_decimal(binary_string):
return str(binary_to_number(binary_string))
def binary_to_hex(binary_string):
hex_digits = {
10: 'a', 11: 'b',
12: 'c', 13: 'd',
14: 'e', 15: 'f'
}
tot = binary_to_number(bits)
return str(hex_digits.get(tot, tot))
if self.dec_bttn.get():
self.output_disp.delete(0.0, END)
self.output_disp.insert(0.0, binary_to_decimal(bits))
elif self.hex_bttn.get():
self.output_disp.delete(0.0, END)
self.output_disp.insert(0.0, binary_to_hex(bits))