2017-12-27 2 views
-6

필자는 tkinter 파이썬과 함께 8 정수와 2 소수점을 갖는 float 필드를 받아들이 기위한 입력 필드를 정의했다. 포맷 8.2를 준수하지 않는다면 에러 메시지를 표시한다. 이 입력란의 형식을 정의하는 데 도움을받을 수 있습니다.엔트리는 float만을 받아 들인다. 8,2

+0

당신은 8 자리 숫자 **와 2 자리수를 의미합니까? – Pac0

+0

문자열을 얻고 점을 사용하여 분할 한 다음 두 부분의 길이와 자릿수를 모두 확인할 수 있습니다. – furas

+1

Stack Overflow에 오신 것을 환영합니다. 게시하기 전에 문제를 검색해보십시오. tkinter의 기본 유효성 검사에 대해서는 https://stackoverflow.com/questions/1018729/python-tkinter-text-entry-validation을 참조하십시오. 그리고 https://stackoverflow.com/questions/8579267/validating-a-text-field-containing-a-float-is-a-valid-percentage-value는 검증 로직을 시작하는 좋은 출발점이 될 것입니다. – weirdev

답변

1

Entry이 또한 A Validating Entry Widget

입니다 그러나 당신은 또한 바인딩 이벤트 <KeyRelease> 당신이 항목의 값을 확인하는 데 사용할 수있는 기능을 수행 할 수 있습니다 Interactively validating Entry widget content in tkinter

에 당신이 볼 수있는 옵션 validate=validatecommand= 있습니다.

도트를 사용하여 텍스트를 분할했습니다. 2 개 이상의 부품을 얻으면 2 개의 점이 더 많습니다.

그 다음에는 두 번째 부분이 있는지, 비어 있지 않은지, 숫자 만 있고 8자를 넘지 않는지 확인합니다. 첫 번째 부분을 확인하는 것과 비슷한 방법입니다.

문자열이 유효하지 않은 경우 콘솔에서 메시지 만 인쇄하지만 더 많은 작업을 수행 할 수 있습니다. 메시지 상자를 표시하거나 텍스트를 바꿀 수 있습니다. Entry.

import tkinter as tk 

def check(event): 
    text = event.widget.get() 
    print('text:', text) 

    parts = text.split('.') 
    parts_number = len(parts) 

    if parts_number > 2: 
     print('too much dots') 

    if parts_number > 1 and parts[1]: # don't check empty string 
     if not parts[1].isdecimal() or len(parts[1]) > 2: 
      print('wrong second part') 

    if parts_number > 0 and parts[0]: # don't check empty string 
     if not parts[0].isdecimal() or len(parts[0]) > 8: 
      print('wrong first part') 

root = tk.Tk() 

e = tk.Entry(root) 
e.pack() 
e.bind('<KeyRelease>', check) 

root.mainloop() 


EDIT : validate= 예 - 상기 제 2 링크의 예에 기초하여.

기능 check() 대부분 변경되지 않았습니다. 메시지를 인쇄하는 대신 return True/False 만 사용합니다. 잘못된 값을 차단합니다.

import tkinter as tk 

def check(d, i, P, s, S, v, V, W): 
    #print("d='%s'" % d) 
    #print("i='%s'" % i) 
    #print("P='%s'" % P) 
    #print("s='%s'" % s) 
    #print("S='%s'" % S) 
    #print("v='%s'" % v) 
    #print("V='%s'" % V) 
    #print("W='%s'" % W)  

    text = P #e.get() 
    print('text:', text) 

    parts = text.split('.') 
    parts_number = len(parts) 

    if parts_number > 2: 
     #print('too much dots') 
     return False 

    if parts_number > 1 and parts[1]: # don't check empty string 
     if not parts[1].isdecimal() or len(parts[1]) > 2: 
      #print('wrong second part') 
      return False 

    if parts_number > 0 and parts[0]: # don't check empty string 
     if not parts[0].isdecimal() or len(parts[0]) > 8: 
      #print('wrong first part') 
      return False 

    return True 

# --- main --- 

root = tk.Tk() 

vcmd = (root.register(check), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') 

e = tk.Entry(root, validate='key', validatecommand=vcmd) 
e.pack() 

root.mainloop() 
+0

도움을 주셔서 감사합니다.하지만 그건 내가 원한 것이 아닙니다. 실제로는 최대 8 개의 정수와 2 개의 소수점이있는 숫자 전용 필드를 삽입 할 수 있어야합니다. 영문자를 입력 할 수 없습니다. 실제로 필드의 출구에 12352.45를 입력하면 형식은 12.352,45가됩니다. – pdecaro

+0

새로운 문자가 숫자가 아닌 경우 항상 입력 텍스트를 바꿀 수 있습니다. 'validatecommand ='를 사용하여 일부 키를 차단하려고 할 수도 있습니다. 그러나 문자열에 올바른 형식이 있는지 수동으로 확인해야합니다. 예를 들어 비슷한 경우 또는 정규식을 사용하여 형식을 검사 할 수 있습니다. – furas

+0

'validate =' – furas

관련 문제