python-3.x - TypeError: ord() 期望一个字符,但找到长度为 5 的字符串
问题描述
我需要做一个类型为 4 的字符的石灰,它带有数字并且不返回错误,但是对于字母它会返回该错误,就像它在标题中一样。我需要限制从“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()
解决方案
ord()
只能转换单个字符 - 像ord("a")
- 但你有很多字符的字符串 - 像ord("BXA7D")
您可以使用for
循环单独处理每个字符
text = "BXA7D" # text = self.var2.get()
text = ''.join(char for char in text if char in 'ABCD')
print(text) # self.var2.set(text)
# BAD
或更长
text = "BXA7D" # text = self.var2.get()
result = []
for char in text:
if char in 'ABCD':
result.append(char)
text = ''.join(result)
print(text) # self.var2.set(text)
# BAD
编辑:我不知道你到底想要什么结果。如果存在则删除所有字符串ABCD0123456789
或仅删除字符ABCD0123456789
如果有 charABCD0123456789
或削减到 5 个字符,这将删除所有字符串。
def limiteSenha(self,*args):
s = self.var2.get()
if len(s) > 5:
for char in s:
if char not in 'ABCD0123456789':
s = ""
break # exit for-loop because there is no need to check rest
self.var2.set(s[:self.max_senha])
elif len(s) == 5:
if not 65<=ord(s[-1])<=68: # retirar ultimo caracter caso nao seja digito
self.var2.set(s[:-1])
else: # aproveitar apenas os primeiros 5 chars
self.var2.set(s[:self.max_senha])
推荐阅读
- spartacus-storefront - 将 CDS 与 Spartacus 集成时出现问题
- php - 带过滤器的页面导航
- javascript - Azure Application Insights - 在 Javascript 中具有自定义属性的 trackEvent
- firebase - Mac os x 设备上的 Unity 排行榜 - Pubnub、Playfab 还是 Firebase?
- javascript - TypeError:无法在 Dotenv.apply 读取未定义的属性“版本”
- c++ - 如何在 C++ 中将字符串类型的约束转移到 z3 求解器 expr?
- c++ - 如何分发 C++ 模块?
- c# - WPF问题MainWindow Frame没有从ViewModel更改Source属性
- c# - Outlook 2016 AttachmentRemove 不会触发
- jquery - Node.js 将所需模块优先于其他所需模块