Python IP地址的Tkinter条目验证

Python IP地址的Tkinter条目验证,python,python-3.x,validation,tkinter,tkinter-entry,Python,Python 3.x,Validation,Tkinter,Tkinter Entry,我使用Tkinter条目将IPv4地址作为用户的输入,我更喜欢使用小部件的validatecommand属性,该属性只允许使用XXX.XXX.XXX.XXX格式的条目,即X位 这个问题可以通过使用表达式^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$对条目进行重新模块匹配来解决,但我希望事先这样做 我已尝试按如下方式使用ipaddress模块: import tkinter as tk import ipaddress as ip import re def

我使用Tkinter条目将IPv4地址作为用户的输入,我更喜欢使用小部件的validatecommand属性,该属性只允许使用XXX.XXX.XXX.XXX格式的条目,即X位

这个问题可以通过使用表达式^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$对条目进行重新模块匹配来解决,但我希望事先这样做

我已尝试按如下方式使用ipaddress模块:

import tkinter as tk
import ipaddress as ip
import re

def validate(value):
    if ip.ip_address(value):
        return True
    return False

window = tk.Tk()

tk.Label(window, text = "IP", font = 'Arial 10 bold').grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'ew')
varip = tk.StringVar()
vcmd = window.register(validate)
ipadd = tk.Entry(window, textvariable = varip, width = 23, validate = 'key', validatecommand = (vcmd, '%P'))
ipadd.grid(row = 0, column = 1, padx = 5, pady = 5)
window.mainloop()
import tkinter as tk

def validate(P, S):
    if S.isdigit():
        if 0 <= len(str(P)) <= 3:
            return True
    return False

window = tk.Tk()

tk.Label(window, text = "IP", font = 'Arial 10 bold').grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'ew')
varip = tk.StringVar()
vcmd = window.register(validate)
ipadd = tk.Entry(window, textvariable = varip, width = 23, validate = 'key', validatecommand = (vcmd, '%P', '%S'))
ipadd.grid(row = 0, column = 1, padx = 5, pady = 5)
window.mainloop()
问题是,只有引入的第一个字符被检查为IPv4地址,并且允许使用所有字符,而不仅仅是数字和点


如何做到这一点?

如果您在验证您的
Ipv4时遇到问题,您可以在代码中添加以下逻辑。我有一个类似的
tkinter
程序,需要
Ipv4
验证。这对我有用

import re 

# Make a regular expression 
# for validating an Ip-address 
regex = '''^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.( 
            25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)'''

# Define a function for 
# validate an Ip addess 
def check(Ip):  

    # pass the regular expression 
    # and the string in search() method 
    if(re.search(regex, Ip)):  
        print("Valid Ip address")  

    else:  
        print("Invalid Ip address")  


# Driver Code  
if __name__ == '__main__' :  

    # Enter the Ip address 
    Ip = "192.168.0.1"

    # calling run function  
    check(Ip) 

    Ip = "110.234.52.124"
    check(Ip) 

    Ip = "366.1.2.2"
    check(Ip) 

我已设法解决了以下问题:

import tkinter as tk
import ipaddress as ip
import re

def validate(value):
    if ip.ip_address(value):
        return True
    return False

window = tk.Tk()

tk.Label(window, text = "IP", font = 'Arial 10 bold').grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'ew')
varip = tk.StringVar()
vcmd = window.register(validate)
ipadd = tk.Entry(window, textvariable = varip, width = 23, validate = 'key', validatecommand = (vcmd, '%P'))
ipadd.grid(row = 0, column = 1, padx = 5, pady = 5)
window.mainloop()
import tkinter as tk

def validate(P, S):
    if S.isdigit():
        if 0 <= len(str(P)) <= 3:
            return True
    return False

window = tk.Tk()

tk.Label(window, text = "IP", font = 'Arial 10 bold').grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'ew')
varip = tk.StringVar()
vcmd = window.register(validate)
ipadd = tk.Entry(window, textvariable = varip, width = 23, validate = 'key', validatecommand = (vcmd, '%P', '%S'))
ipadd.grid(row = 0, column = 1, padx = 5, pady = 5)
window.mainloop()
将tkinter作为tk导入
def验证(P,S):
如果S.isdigit():

如果0您不希望它接受类似999.999.999.999这样的地址,则必须对其进行更改,但在类似应用程序中为我工作的正则表达式如下所示。我写它是为了一个八位字节一个八位字节的验证。我对这一点还比较陌生,所以您必须原谅PEP8格式问题

import tkinter as tk
import re


def validate(P):
    test = re.compile('(^\d{0,3}$|^\d{1,3}\.\d{0,3}$|^\d{1,3}\.\d{1,3}\.\d{0,3}$|^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{0,3}$)')
    if test.match(P):
        return True
    else:
        return False

window = tk.Tk()

tk.Label(window, text = "IP", font = 'Arial 10 bold').grid(row = 0, column = 0, padx = 5, pady = 5, sticky = 'ew')
varip = tk.StringVar()
vcmd = window.register(validate)
ipadd = tk.Entry(window, textvariable = varip, width = 23, validate = 'key', validatecommand = (vcmd, '%P'))
ipadd.grid(row = 0, column = 1, padx = 5, pady = 5)
window.mainloop()

因此,如果我正确理解了您的查询,您在验证正确的IPv4地址时是否遇到问题?问题是Tkinter Entry小部件允许我从键盘引入所有字符,我想将其限制为仅接受数字和点。如果IPv4地址正确与否,则可以在之后进行验证。也许我没有很好地解释自己xd。你是在问如何将输入限制为仅限数字和句点字符吗?你看到了吗?这是完美的,一旦条目小部件被填充,但我想限制这个条目只接受数字和点。要么我不理解你的查询,要么你没有通过正则表达式。因为从外观上看,它只接受和验证数字和点。