这是我在这个网站上的第二个问题,他们都处理’if’语句没有按预期工作.
我一直在学习
Python大约3-4个月,我记得在开始的时候我正在学习’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’方法.这可能比需要的稍微多一点但是太多太多比忽略任何数量都要好.
因为我必须最终将字符串分解为半字节转换的半字节字符串,所以它现在设置为< = 4.所以我只使用4位字符串测试它. 就像现在一样,使用’elif self.hex_bttn’它会将二进制转换为十进制,而不管选择哪个复选框.
如果我将其更改为’if self.hex_bttn’,则无论选择哪个复选框,它都会转换为十六进制.
数学和一切正常,输出正确.它只是混淆了这些“if”语句阻碍了我的进步.
对我的初学者来说,这似乎是一个相当简单的测试,但我显然错过了一些东西.
如果有人能让我走上正确的道路,我将不胜感激.
祝福
F.
最佳答案 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是一个对象,而不仅仅是一个简单的布尔值.
在if语句中使用self.dec_bttn.get()来检查复选框的状态.
查看Tkinter reference以了解与Tkinter变量类型相关的其他一些方法.