我正在尝试检查用户对我创建的Tk GUI的输入是否具有我想要的数据类型(整数),但是我只能检查他们的输入是否为布尔值,我还需要检查其输入是字符串还是整数:
from tkinter import*
# creates a GUI
Tester = Tk()
NonEssentialFoodEntry = Entry(Tester, width="30")
NonEssentialFoodEntry.place(x=300,y=540)
def checker():
if NonEssentialFoodEntry.get() == 'TRUE' or 'FALSE':
tkinter.messagebox.showerror("","You have entered a boolean value in the Non-EssentialFood entry field, please enter an integer")
Checker=Button(Tester, height="7",width="30",font=300,command=checker)
Checker.place(x=700, y=580)
答案 0 :(得分:1)
好吧,您可以在输入上运行正则表达式,并检查哪个组不是None
:
(?:^(?P<boolean>TRUE|FALSE)$)
|
(?:^(?P<integer>\d+)$)
|
(?:^(?P<float>\d+\.\d+)$)
|
(?:^(?P<string>.+)$)
请参见a demo on regex101.com。首先,每个输入都是一个字符串。
Python
中:
import re
strings = ["TRUE", "FALSE", "123", "1.234343", "some-string", "some string with numbers and FALSE and 1.23 in it"]
rx = re.compile(r'''
(?:^(?P<boolean>TRUE|FALSE)$)
|
(?:^(?P<integer>-?\d+)$)
|
(?:^(?P<float>-?\d+\.\d+)$)
|
(?:^(?P<string>.+)$)
''', re.VERBOSE)
for string in strings:
m = rx.search(string)
instance = [k for k,v in m.groupdict().items() if v is not None]
print(instance)
if instance:
print("{} is probably a(n) {}".format(string, instance[0]))
正如您在原始问题上方的评论中所述,您可能会采用另一种方法try/except
。
答案 1 :(得分:1)
一种解决方法是尝试转换您的输入并查看是否可以管理。
编辑:这基本上是@martineau在评论中建议的方法
以下代码改编自FlyingCircus(免责声明:我是主要作者):
def auto_convert(
text,
casts=(int, float, complex)):
"""
Convert value to numeric if possible, or strip delimiters from string.
Args:
text (str|int|float|complex): The text input string.
casts (Iterable[callable]): The cast conversion methods.
Returns:
val (int|float|complex): The numeric value of the string.
Examples:
>>> auto_convert('<100>', '<', '>')
100
>>> auto_convert('<100.0>', '<', '>')
100.0
>>> auto_convert('100.0+50j')
(100+50j)
>>> auto_convert('1e3')
1000.0
>>> auto_convert(1000)
1000
>>> auto_convert(1000.0)
1000.0
"""
if isinstance(text, str):
val = None
for cast in casts:
try:
val = cast(text)
except (TypeError, ValueError):
pass
else:
break
if val is None:
val = text
else:
val = text
return val
请注意,对于布尔型情况,您将需要一个专用函数,因为bool(text)
会在text
为非空时立即评估为True(最新版本的{{ 3}}作为flyingcircus.util.to_bool()
)。
答案 2 :(得分:0)
例如,您可以使用以下代码围绕有效整数构建if语句:
if isinstance(<var>, int):
否则,用type(<var>)
获取类型并围绕它构建函数。