<p>我意识到这是一个很晚的答案,但我觉得我可以给这个更简单的答案。。。一旦你了解了它的工作原理,它就非常简单了。</p>
<p>使用<code>Entry</code>小部件附带的验证功能。</p>
<p>假设<code>self</code>是一个小部件:</p>
<pre><code>vcmd = (self.register(self.callback))
w = Entry(self, validate='all', validatecommand=(vcmd, '%P'))
w.pack()
def callback(self, P):
if str.isdigit(P) or P == "":
return True
else:
return False
</code></pre>
<p>您不需要包含所有的<em>替换代码</em>:(<code>'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'</code>),只需要您将要使用的代码。</p>
<p><code>Entry</code>小部件返回一个字符串,因此您必须以某种方式提取任何数字,以便将它们与其他字符分开。最简单的方法是使用<code>str.isdigit()</code>。这是一个内置在python库中的方便的小工具,不需要额外的导入,它将标识从<code>Entry</code>小部件返回的<em>字符串</em>中找到的任何数字(数字)。</p>
<p>if语句的<code>or P == ""</code>部分允许您删除整个条目,没有它,您将无法删除最后一个(条目框中的第一个)数字,因为<code>'%P'</code>返回空值并导致回调返回<code>False</code>。我不想详细说明为什么在这里。</p>
<p><code>validate='all'</code>允许回调在您<code>focusin</code>、<code>focusout</code>或任何<code>key</code>笔划更改小部件中的内容时计算<code>P</code>的值,因此您不会为误入的散乱字符留下任何洞。</p>
<p>总之,让事情变得简单。如果回调返回<code>True</code>,则允许输入数据。如果回调返回“False”,则实际上将“忽略”键盘输入。</p>
<p>看看这两份推荐信。它们解释了每个替换代码的含义以及如何实现它们。</p>
<p><a href="http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html" rel="noreferrer">http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html</a>
<a href="http://stupidpythonideas.blogspot.ca/2013/12/tkinter-validation.html" rel="noreferrer">http://stupidpythonideas.blogspot.ca/2013/12/tkinter-validation.html</a></p>
<p>编辑:
这只会处理盒子里允许的东西。但是,您可以在回调函数中,将<code>P</code>的任何值添加到您希望的任何变量中。</p>