【问题标题】:Tkinter Entry validation for IP AddressIP 地址的 Tkinter 条目验证
【发布时间】:2019-08-14 09:45:47
【问题描述】:

我使用 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 地址,并且允许所有字符,不仅是数字和点。

怎么可能?

【问题讨论】:

  • 如果我正确理解了您的查询,您是否在验证正确的 IPv4 地址时遇到了麻烦?
  • 问题是 Tkinter Entry 小部件允许我从键盘引入所有字符,我想限制它只接受数字和点。 IPv4 地址是否正确的验证可以在之后进行。也许我没有很好地解释自己xd。
  • 您是否在问如何将输入限制为仅数字和句点字符?你见过stackoverflow.com/a/4140988/7432吗?

标签: python python-3.x validation tkinter tkinter-entry


【解决方案1】:

如果您在验证 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) 

【讨论】:

  • Entry 小部件填满后就可以这样做了,但我想将此 Entry 限制为仅接受数字和点。
  • 要么我不理解你的查询,要么你没有通过正则表达式。因为从外观上看,它只接受和验证数字和点。
【解决方案2】:

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

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()

【讨论】:

    【解决方案3】:

    如果您不希望它接受像 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2012-07-02
      相关资源
      最近更新 更多