【发布时间】:2019-07-16 20:24:54
【问题描述】:
我需要做一个 4 字符类型的limete,它带有数字并且不会返回错误,但是对于字母它会返回标题中的错误。我需要限制从“0 到 9”和“A 到 D”。 在limiteUsuario()方法中,一切正常。
from tkinter import *
import tkinter as tk
class loginUser:
def __init__(self, window, master=None):
self.wind = window
self.wind.title("System F2T")
#Definicoes de fonte p/ o layout de login
self.fonteTitulo = ("Arial","10","bold")
self.fontePadrao = ("Arial", "10")
self.var = StringVar() #create the var first before you assign them
self.var2 = StringVar()
#Labels e campos de texto do sistema de login
self.userLabel = Label(text="Digite seu usuário:", font=self.fontePadrao,bg="#000",fg="#FFF").place(x=27,y=60)
self.user = Entry(textvariable=self.var, font=self.fontePadrao,bg="#FFF",fg="#000")
self.user.place(x=140,y=60,width=110)
self.senhaLabel = Label(text="Digite sua senha:", font=self.fontePadrao,bg="#000",fg="#FFF").place(x=29,y=90)
self.senha = Entry(textvariable=self.var2, font=self.fontePadrao,bg="#FFF",fg="#000")
self.senha.place(x=140,y=90,width=110)
self.max_user = 1
self.var.trace("w", self.limiteUsuario)
self.max_senha = 4
self.var2.trace("w", self.limiteSenha)
def limiteUsuario(self,*args):
u = self.var.get()
if len(u) == 1 and not 65<=ord(u)<=68 and not 48<=ord(u)<=57: # you can also use *if not u in "ABCD"*
self.var.set("")
elif len(u) > 1:
if not 65<=ord(u[-1])<=68: # retirar ultimo caracter caso nao seja digito
self.var.set(u[:-1])
else: # aproveitar apenas os primeiros 5 chars
self.var.set(u[:self.max_user])
def limiteSenha(self,*args):
text = self.var2.get()
text = ''.join(char for char in text if char in 'ABCD')
if len(text) == 4 and not 65<=ord(text)<=68 and not 48<=ord(text)<=57: # you can also use *if not u in "ABCD"*
self.var2.set("")
elif len(text) > 4:
if not 65<=ord(text[-1])<=68: # retirar ultimo caracter caso nao seja digito
self.var2.set(text[:-1])
else: # aproveitar apenas os primeiros 5 chars
self.var2.set(text[:self.max_senha])
print(self.var2.set(text))
if __name__ == "__main__":
root = Tk()
root['bg'] = "#000"
loginUser(root)
#Tamanho da janela
root.geometry("330x200")
root.mainloop()
【问题讨论】:
-
@KushanGunasekera 但它不是加密,它只是限制,对于我得到它的用户,我需要密码,但它不给。
-
我无法用您的代码重现该错误。尝试输入数字和字母,但第一个输入字段似乎只接受一个字符,第二个字段接受任何四个字符...
-
ord()只能转换单个字符 -ord("a"),而不是ord("hello")。如果你有很多字符的字符串,那么你可以使用for-loop 来处理单个字符。for char in "hello": ord(char)
标签: python-3.x tkinter logical-operators