【问题标题】:if/elif mash upif/elif 混搭
【发布时间】:2012-02-05 05:25:31
【问题描述】:

这是我在这个网站上的第二个问题,他们都处理 'if' 语句没有按预期工作。 我已经学习 Python 大约 3-4 个月了,我记得刚开始学习 'for'、'if's 和 'while's 时,我记得认为 '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' 方法。这可能比需要的多一点,但稍微多一点总比忽略任何数量要好。

因为我最终必须将字符串分解为半字节字符串以进行十六进制转换,所以现在将其设置为

就目前而言,使用 'elif self.hex_bttn' 将二进制转换为十进制,无论选择哪个复选框。 如果我将其更改为“if self.hex_bttn”,那么无论选中哪个复选框,它都会转换为十六进制。

数学和一切工作正常并正确输出。只是与这些“如果”陈述的混合阻碍了我的进步。 在我的初学者看来,这似乎是一个相当简单的测试,但我显然遗漏了一些东西。

如果有人能让我走上正确的道路,我将不胜感激。

祝福 F.

【问题讨论】:

  • print self.hex_bttn 输出什么? if 语句默认为 True 如果表达式不是显式错误([]{}0FalseNone'')。
  • 保持原样:elif self.hex_bttn 我在 3 个位置尝试过。 1) 在两个 if 块之外的方法结束时得到 PY_VAR2。 2) 在 elif self.hex_bttn 之后立即没有任何回报。和 3) if self.dec_bttn 并再次获得 PY_VAR2 之后立即。
  • self.hex_bttn的值是多少?
  • 我将它们都设置为 BooleanVar()。这意味着我相信,如果一个被选中,则意味着 True 而未选中 = False。
  • 试试if self.het_bttn.get()

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


【解决方案1】:

if 语句,它是elif 的补充,作用于Boolean values。如果一个变量或任何被测试的变量已经不是布尔值,那么它是强制的并且以真/假的方式被理解。

任何非零且非空的对象都被解释为“真”。因此,假设 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一个对象,而不仅仅是一个简单的布尔值。

if 语句中使用self.dec_bttn.get() 来检查复选框的状态。

查看Tkinter reference 了解与 Tkinter 变量类型相关的其他一些方法。

【讨论】:

  • 是的,我将它们设置为 self.dec_bttn = BooleanVar() 等。我只是将所有(self.bin_bttn、self.dec_bttn 和 self.hex_bttn)更改为 IntVar(),并且得到相同结果。
  • @Icsilk:正如Blender提到的,你需要使用变量对象的.get()方法。而且,如果您愿意,可以使用BooleanVar
  • 现在正在运行,非常感谢您的时间和精力
【解决方案2】:

听起来你 self.dec_bttnself.hex_bttn 评估为 true,可能是因为,正如 @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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多