【问题标题】:TypeError: ord() expected a character, but string of length 5 foundTypeError: ord() 期望一个字符,但找到长度为 5 的字符串
【发布时间】: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


【解决方案1】:

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

如果有 char ABCD0123456789,则删除所有字符串,或削减为 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])

【讨论】:

  • 好的,万一我把它放在self.var2.set()下面?
  • 如果我不明白这行代码适合哪里,对不起,我对它有点陌生。
  • 查看代码中的 cmets - 在 self.var2.get()self.var2.set() 之间
  • 会是这样吗?我把它放在初始代码中。所以他还是继续输入“ABCD”以外的字符。对不起我的愚蠢
  • 参见 cmets 示例 - 你必须使用 text = self.var2.get() - 使用 text = "BXA7D" 毫无意义。这个text = "BXA7D" 仅在代码中运行,无需其他代码 - 这样每个人都可以测试它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多