if / elif mash up

时间:2012-02-05 05:25:31

标签: python if-statement python-3.x tkinter

这是我在这个网站上的第二个问题,他们都处理'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。

2 个答案:

答案 0 :(得分:6)

if语句及其补码elif适用于Boolean values。如果变量或正在测试的任何变量已经不是布尔值,则强制并以真/假的方式理解。

任何非零且非空的对象都被解释为“True”。因此,假设dec_bttnhex_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_bttnself.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))