<p><code>int(something)</code>将引发<code>TypeError</code>或<code>ValueError</code>,如果它可以从其参数实例化int,那么最简单的解决方案是捕获异常并重试。但是,由于我们希望允许用户取消操作,因此我们仍将测试<code>None</code>,然后退出</p>
<pre><code>cancel = False
basemsg = msg = "Voer een postcode in:"
while True:
postcodeinvoer = easygui.enterbox(msg=msg, title="Postcodezoeker")
if postcodeinvoer is None:
# user canceled
cancel = True
break
try:
postcodeinvoer = int(postcodeinvoer)
except (TypeError, ValueError) as e:
msg = "invalid value ! " + basemsg
else:
# ok, let's get out
break
if cancel:
# exit the program or whatever...
raise SysExit()
# ok, proceed with the user's value
</code></pre>
<p>现在你似乎犯了一个新手常犯的错误,那就是认为如果某个东西是由数字组成的,那么它就是一个数字,事实并非如此。邮政编码或电话号码通常是字符串,而不是整数——问问自己,将电话号码乘以2,然后将结果除以邮政编码会有什么意义;)</p>
<p>你不应该把<code>postcodeinvoer</code>转换成<code>int</code>。如果您所在国家的邮政编码仅由数字组成(并非所有国家都是这样),则可以测试用户输入是否是由<code>N</code>数字组成的字符串(<code>N</code>的值取决于您所在的国家):</p>
<pre><code> postcodeinvoer = easygui.enterbox(msg=msg, title="Postcodezoeker")
if postcodeinvoer is None:
# user canceled
cancel = True
break
if (postcodeinvoer.isdigit() and len(postcodeinvoer) == N):
# valid code
break
else:
# invalid code, ask again
msg = "invalid value ! " + basemsg
</code></pre>
<p>但即便如此,这也可能不是一个很好的验证。。。你知道吗</p>