【问题标题】:Python: If / Else statement does not work when the condition is metPython:条件满足时if/else语句不起作用
【发布时间】:2020-04-26 11:34:20
【问题描述】:

我正在处理我的 if/else 语句在满足条件时不起作用的问题。

关键是当输入区域中有多个字符时,我想将我的按钮(“提交”)配置设置为 state=NORMAL。我认为代码是正确的,但问题可能是由代码的静态引起的。在其他情况下,它需要调用命令(单击或其他事件),但这里只是条目内容的更改,我不知道如何编码。

下面是带有按钮的函数和我的 if/else 语句。感谢您的帮助和各种建议。

def sign():
    infoLabel = Label(root, text="Enter your name: ").grid(row=0, column=0)
    global e
    e = Entry(root, width=25)
    e.grid(row=0, column=1, columnspan=2)
    submit = Button(root, text="Submit", command=signbtn)
    submit.grid(row=0, column=3)

    if len(e.get()) == 0:
        submit.config(state=DISABLED)
    else:
        submit.config(state=NORMAL)

【问题讨论】:

  • 为什么说“if/else 语句不起作用”?怎么了?你期待发生什么?此外,看起来你的 if/else 可以更好地替换为 try/except 块。
  • @Keldron 我认为他们的意思是它总是执行else 的情况,而他们希望运行len(e.get())==0 的情况。
  • 您有没有想过在if 语句之前检查e.get() 返回的内容?如果这是您的实际代码,那么您在创建条目后大约一毫秒调用.get(),这远在用户看到条目小部件之前。
  • @BryanOakley 这正是我的意思。我希望代码检查输入区域中有多少个字符。如果有多个,按钮的状态将变为 NORMAL。我已经意识到代码的结构是错误的,但是找出它是如何工作的似乎是一个挑战。

标签: python if-statement tkinter


【解决方案1】:

让我们澄清一些事情。什么时候应该将状态设置为“正常”?当条目的区域长度大于一 (>) 或大于或等于 (>=) 一时?我猜第二个基于您的代码。另外,那是 tkinter 吗?

现在,关于您的具体问题,我在您的代码中看到的是您创建了条目,然后立即且仅一次检查其长度是否为零。由于您的检查在函数中,它会立即执行并且没有人编辑过该条目,所以它是空的。因此,它有len(e.get()) == 0,所以无论之后发生什么,它都会设置state=DISABLED

最后,您应该考虑到@Premkumar chalmeti 的回答,考虑全局

【讨论】:

  • 感谢您的回复!是的,它是 tkinter,当输入区域中至少有一个字符时,代码应该启用按钮为 (state=NORMAL)。我会检查下面的答案。无论如何谢谢你!下次我会确保提供所有信息。我是python新手,所以我无法正确区分。
【解决方案2】:

@Martin 准确回答您的问题,您能否转储 e.get() 方法返回的内容?

您的代码可能会在某些极端情况下中断(如果e.get() 返回None,等等,您永远不知道),所以我建议在 sn-p 下面和我认为的一些改进。

您可以将 if/else 减少为单行并且更具可读性,

submit.config(state=NORMAL if e.get() else DISABLED)

此外,您应该尽可能避免使用全局变量。

def sign(e):
    infoLabel = Label(root, text="Enter your name: ").grid(row=0, column=0)

    e = Entry(root, width=25)
    e.grid(row=0, column=1, columnspan=2)

    submit = Button(root, text="Submit", command=signbtn)
    submit.grid(row=0, column=3)
    submit.config(state=NORMAL if e.get() else DISABLED)

    return e

【讨论】:

  • 这两条可能有用的建议,但如何回答这个问题?
  • 看来您的答案是使用if e.get()) 而不是if len(e.get()) == 0
  • 目前我们还不知道e.get() 会返回什么。我以为让 python 来完成这项工作。 :)
  • 您好,感谢您的回复! e.get() 应该在我的条目中返回输入,其中应该写入用户名。条目旁边有一个按钮,我希望在用户输入至少一个字符之前禁用该按钮。是什么原因,您会使用 return 以及如何使用它来解决我的问题?谢谢
  • 使用 return 不会解决你的问题,它会让你的代码更好,从长远来看更不容易出错。在另一个答案中指出了您的问题。此外,通过“转储 e.get() 返回的内容”,他们的意思是“添加 print(e.get()) 并告诉我们结果”。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多