【问题标题】:IF-ELIF statements nestedIF-ELIF 语句嵌套
【发布时间】:2016-03-04 00:54:32
【问题描述】:

我想知道是否有更好的方法来写这个。下面说明的当前代码有效。我只是想知道是否有更好的方法。

这是为了验证。因此,if 语句检查所有必填字段,如果它们可接受,则进入执行代码。问题开始是因为

的输入字段

self.text_fmax

未被接受为整数。所以这个特定的字段,首先检查是否为空,然后忽略,如果不是,则值必须是 0 到 180 之间的整数。

  def call_back(self):
    if len(self.text_n.get()) == 0:
        tkMessageBox.showinfo("Mandatory Information", "Please input an integer value for Number of Tessellations Cells")
    elif len(self.text_id.get()) == 0:
        tkMessageBox.showinfo("Mandatory Information", "Please input an integer value for Tessellation Identifier")
    elif len(domain_container) == 0:
        tkMessageBox.showinfo("Mandatory Information", "Please input Domain")
    elif len(self.text_fmax.get()) != 0:
        a = int(self.text_fmax.get())
        if a < 0 or a > 180:
            tkMessageBox.showinfo("Incorrect Value", "Face Flatness should be less than 180")
        elif len(filename4) == 0:
            tkMessageBox.showinfo("Mandatory Information", "Please input Output File Name")
        else:
            self.execute_neper_code()
    elif len(filename4) == 0:
        tkMessageBox.showinfo("Mandatory Information", "Please input Output File Name")
    else:
        self.execute_neper_code()

【问题讨论】:

  • 如果这段代码有效,那么这个问题似乎更适合the Code Review StackExchange site
  • @ShadowRanger:谢谢你,我从来不知道有这样的网站存在。我仍然是 Pyton2.7 的新手。我也会在那里发帖。谢谢:)

标签: python python-2.7 tkinter tkmessagebox


【解决方案1】:

如果你想避免重复的代码和字符串,你可以试试下面的方法。 以下不是完整的代码,而是简单的示例。 t_msgsdict 中的 key 表示要验证的字段和要验证的值(可以是范围)。

def call_back(self):
    t_msgs = {"mdt": "Mandatory Information",
              "incrt_val" :"Incorrect Value"}
    checkFields = {(self.text_n, 0): 
                    (t_msgs["mdt"], 
                     "Please input an integer value for Number of Tessellations Cells"),
                   (self.text_id, 0): 
                    (t_msgs["mdt"], 
                     "Please input an integer value for Tessellation Identifier"),
                   (domain_container, 0): 
                    (t_msgs["mdt"], 
                     "Please input Domain"),
                   (self.text_fmax, range(0, 181, 180)): 
                    (t_msgs["incrt_val"], 
                     "Face Flatness should be less than 180"),
                   (len(filename4), 0): 
                    (t_msgs["mdt"], 
                     "Please input Output File Name")}

    for field in checkFields:
        if not field[1]:
            tkMessageBox.showinfo(checkFields[field][0], checkFields[field][1])
        else:
            if not (field[1][0] < field[0].get() < field[1][1]):
                tkMessageBox.showinfo(checkFields[field[0]], checkFields[field][1])

【讨论】:

    【解决方案2】:

    您通常不需要检查len == 0,只需测试对象“真实性”即可。

    def call_back(self):
        show = tkMessageBox.showinfo
        if not self.text_n.get():
            show("Mandatory Information", "Please input an integer value for Number of Tessellations Cells")
    
        elif not self.text_id.get():
            show("Mandatory Information", "Please input an integer value for Tessellation Identifier")
    
        elif not domain_container:
            show("Mandatory Information", "Please input Domain")
    
        elif self.text_fmax.get() and not 0 <= int(self.text_fmax.get()) <= 180:
            show("Incorrect Value", "Face Flatness should be less than 180")
    
        elif not filename4:
            show("Mandatory Information", "Please input Output File Name")
    
        else:
            self.execute_neper_code()
    

    【讨论】:

    • 嗨约翰,感谢您的代码...但是,我真正想要的是消除必须在内部循环内验证“filename4”两次,在外循环外验证一次。
    • @AlyAbdelaziz,好的,现在看看
    • 注意:如果我不做“len”检查,如果输入字段为空并给出错误,程序不会忽略。所以首先我检查是否为空,如果不是,然后我检查整数值。
    • 对,不过不用if len(somestr) != 0...,可以用if somestr...
    • 谢谢。这似乎有效。我了解您仅使用“if”语句的目的。我想我只是发现“len”方法更容易,我猜。感谢更新代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多