python – if / elif mash up

这是我在这个网站上的第二个问题,他们都处理’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变量类型相关的其他一些方法.

点赞