python – if / elif mash up
这是我在这个网站上的第二个问题,他们都处理’if’语句没有按预期工作.
我一直在学习 Python大约3-4个月,我记得在开始的时候我正在学习’for’,’if’和’而我记得’if’语句是三个中最简单的一个;我开始意识到’如果’的陈述并不像我曾经想象的那样明确. 我正在编写一个转换器,可以在二进制,十进制和十六进制之间进行转换,而无需使用任何Python内置数学函数.我正在使用tkinter. 我将询问的问题是在选择“二进制”单选按钮的转换时处理.低于3’转换”单选按钮是3’转换为’复选框. 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,htot) 我发布了整个’from_binary’方法.这可能比需要的稍微多一点但是太多太多比忽略任何数量都要好. 因为我必须最终将字符串分解为半字节转换的半字节字符串,所以它现在设置为< = 4.所以我只使用4位字符串测试它. 就像现在一样,使用’elif self.hex_bttn’它会将二进制转换为十进制,而不管选择哪个复选框. 数学和一切正常,输出正确.它只是混淆了这些“if”语句阻碍了我的进步. 如果有人能让我走上正确的道路,我将不胜感激. 祝福 解决方法
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,variable=self.dec_checked,variable=self.hex_checked,... ) 注意IntVar.这是存储值的地方.但是,您不必使用IntVar,您也可以使用BooleanVar或任何其他Tkinter变量类型. 但是,我离题了,我发现你已经在使用BooleanVar了.所以,你已经知道了大部分内容.但是,仅仅检查self.dec_bttn不起作用的原因是因为dec_bttn是一个对象,而不仅仅是一个简单的布尔值. 在if语句中使用self.dec_bttn.get()来检查复选框的状态. 查看Tkinter reference以了解与Tkinter变量类型相关的其他一些方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |