首页 > 解决方案 > IP 地址的 Tkinter 条目验证

问题描述

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

问题可以通过 re 模块与表达式匹配条目来解决 ^\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()

问题是只有引入的第一个字符被检查为 IPv4 地址,并且允许所有字符,而不仅仅是数字和点。

怎么可能做到?

标签: pythonpython-3.xvalidationtkintertkinter-entry

解决方案


如果您在验证时遇到问题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) 

推荐阅读