Python3.x-IF语句,用于在tk上填充多个输入字段时生成结果

Python3.x-IF语句,用于在tk上填充多个输入字段时生成结果,python,if-statement,python-3.x,Python,If Statement,Python 3.x,我有4个输入字段,我希望当这些字段中有多个有一个输入时弹出一条错误消息。听起来很简单,但我似乎无法得到一个if语句来实现我想要的 我当前的非工作代码如下:- val1 = (entry1.get()) val2 = (entry2.get()) rval1 = (rootentry1.get()) rval2 = (rootentry2.get()) rval3 = (rootentry3.get())

我有4个输入字段,我希望当这些字段中有多个有一个输入时弹出一条错误消息。听起来很简单,但我似乎无法得到一个if语句来实现我想要的

我当前的非工作代码如下:-

        val1 = (entry1.get())
        val2 = (entry2.get())
        rval1 = (rootentry1.get())
        rval2 = (rootentry2.get())
        rval3 = (rootentry3.get())
        rval4 = (rootentry4.get())
        glthickval = (glthick.get())
        glthickvalfloat = float(glthickval)
        validation = 0
        global data

        try:
            int(val1)
            int(val2)
        except ValueError:
            message5 = 'The number must be a whole number!'
            box.showerror("Invalid Input", message5)

        if int(rval1+rval2+rval3+rval4) > 0:
            if int(rval1) and int(rval2) and int(rval3) and int(rval4) >0:
                message7 = 'You have selected more than one type of root!'
                box.showerror("Invalid Input",message7)
这个底部部分是我无法工作的部分,很明显,只有当所有值都大于0时,规则才会标记。也许还有别的办法


提前感谢。

列出所有值,过滤掉等于零的值,然后测量结果的长度

values = [rval1, rval2, rval3, rval4]
filled_values = [value for value in values if int(value) != 0]
if len(filled_values) > 1:
    print "You have selected more than one type of root!"


顺便说一句,当您有多个变量的名称在末尾只相差一个数字时,这通常是您应该使用列表的一个好迹象。考虑一个单一的代码> RooToStaseList,其中包含四个根条目对象。

< P>这里有很多答案,它们有很好的列表理解,和<代码> lambda < /Case> s,以及其他聪明的东西,但是它们似乎都会降低你想做的事情的可读性…… 我将制作一个小函数,它告诉您填写了多少条目,类似于:

def filledEntries(entries):
  filledEntryCount = 0
  for entry in entries:
    if entry != 0: filledEntryCount += 1

  return filledEntryCount
然后吃点类似的东西

if filledEntries(entries) > 1:
  box.showerror("Invalid Input", "You have selected more than one type of root!")

我想你可以用这个

if len(list(filter(lambda x: x is not None, [rval1, rval2, rval3, rval4]))) > 1:
  # you've got more than one value that's not none

@LMCT,一种确保用户一次不能进入错误(或多个)输入框的好方法是禁用这些输入框,直到需要它们(不使用if语句,但仍然是一个好的解决方案):

可以使用此选项,以便用户一次输入一次,然后点击按钮提交第一个条目,并使下一个条目框可用。或者,如果您需要,您可以制作另一个按钮(复选框/菜单按钮或其他什么?),供用户选择他们希望在当时可以使用的输入框


我想我还是加上这个(即使答案已经被接受),因为在我看来这是一个很好的解决方案,它可能对你很方便

你真的很喜欢你的支架。有些东西永远不会消失,伙计!我对括号的热爱就是其中之一!虽然在这段代码中没有一个不必要的括号。@LMCT:代码中有很多不必要的括号<例如,code>rval1=rootentry1.get()就足够了。我还建议不要给变量命名,比如
var1
var2
,等等。这对代码的可读性没有帮助,变量名后面需要数字这一事实表明它们不是变量的好名称。@chepner谢谢你的建议,我不知道如果没有括号,语法会起作用。+1表示以数字结尾的多个变量。这一切都是关于编写代码,就像你未来的自己拿着锤子坐在你身后一样。Lambda,嗯,这可能会很好地工作,我必须了解它是如何工作的,看看它是否比当前的修复程序更能解决其他问题。谢谢,我喜欢!这相当聪明,我想这是编写一个程序的代价,因为你只是让它工作,而不是正确地思考和构建它,我显然还没有像一个真正的程序员那样思考。这有助于非常感谢我会投票给你,但根据stackoverflow的说法,显然我的观点是不相关的:PI发现,如果你只是假装你需要的所有函数从一开始就存在,然后把它们扔进去,然后再写函数,它通常会给出更整洁的结果。有趣的实践,我必须记住这一点。我相信,在我尝试使用python和tkinter或pyside处理更复杂的程序时,您将来会看到更多我的帖子。我期待着你们继续提供意见:)
rval1.config(state = 'disabled')
# then when needed
rval1.config(state = 'normal')