【问题标题】:Using StringVar data as a list使用 StringVar 数据作为列表
【发布时间】:2017-01-14 06:00:05
【问题描述】:

我关注这个网站已经有一段时间了。这真的很有帮助。所以,感谢所有有用的提示。

过去两周我一直在寻找这个答案,但没有任何成功,所以现在我不得不问,因为我对目前的障碍完全感到沮丧。

如何使用 StringVar 作为列表?

基本上,我正在为我的妻子编写以下程序。代码非常混乱,因为这是我尝试编写的第一个程序。

我的想法是我会采用 3 个变量;密码、密码和网站,然后使用 if 语句和列表对其进行一些处理以创建唯一密码。

第一个问题是我无法限制输入小部件的字符长度,但最后我解决了这个问题,但我仍然想限制可以输入的字符。

例如在网站输入框中,我只想允许字母。

如果我可以将 StringVar 转换为列表,我可以使用凌乱的 if 语句来做一些工作,以在每个索引中只允许某些字符,但每次我尝试它都说 stringvars 不能用作列表。

我需要将它们作为一个列表来限制可以输入的字符类型,并且我可以对变量进行处理以获得最终输出。

代码:

from Tkinter import *
import Tkinter
from PIL import Image, ImageTk
import os

Title= ("Helvetica", 20, "bold", "underline")
Heading= ("Courier", 20, "bold")
Body= ("Courier", 15)
Body1= ("Courier", 15, "bold")
notice= ("Courier", 10)
Body2= ("Courier", 15, "bold", "underline")

root = Tk()
root.title("Koala Series: Encrypter")
root.configure(background="#ffefd5")
root.geometry('{}x{}'.format(510, 600))

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1) # not needed, this is the default behavior
root.rowconfigure(1, weight=1)
root.rowconfigure(2, weight=1)

website =  StringVar()

Titlemsg = Label(root, text="Koala Encrypter", font=Title, bg="#00FA9A", relief=RAISED,)
Titlemsg.grid( row=7, pady=25, sticky=N+S+E+W)
img1 = ImageTk.PhotoImage(Image.open("koala.jpeg"))
startpic = Label(root, image = img1, relief=RIDGE )
startpic.grid( row=10,pady=25, )
Head = Label(root,anchor=CENTER,text="Welcome to the Koala Encrypter \n\n A Koala series tool that allows you\n\n to Encrypt your passwords \n\n Click \'Start Encrypting\' to continue \n\n", font=Body, bg="#ffefd5", relief=RAISED,)
Head.grid( row=14, pady=25, columnspan=2, sticky=N+S+E+W)

web = Label(root, text="WEBSITE: ", font=Body, bg="#ffefd5", justify=CENTER,)

#website.set("Enter your website here") 
entry = Entry(root,textvariable=website , justify=CENTER,relief=SUNKEN,cursor="pencil", takefocus=True )

Notice1 = Label( text="Please only insert the first 5 letters of the website!!",font=notice, bg="#ffefd5", fg="#0000ff",)

passw = Label(root, text="PASSWORD: ", font=Body, bg="#ffefd5", justify=CENTER)

passwordvar= StringVar()

entry1 = Entry(root, textvariable= passwordvar, justify=CENTER,relief=SUNKEN, cursor="pencil", takefocus=True )

Notice= Label(root, text="Your password must only be  5 characters long!!", font=notice, bg="#ffefd5", fg="#0000ff", justify=CENTER)
def callback(event):
    if "<0>":
        top = Toplevel(bg="#ffefd5")
        top.title("Koala Encrypter")
        popuptitle = Label(top, text="Your secret number must be between 1 and 9:", font=Body1, fg="red", bg="#ffefd5")
        popuptitle.grid(row = 2,column=0, padx=5, pady = 50,sticky=N+S+E+W)

secret = Label(root, text="SECRET NUMBER: ", font=Body, bg="#ffefd5" , justify=CENTER,)
numbervar = StringVar()

entry2 = Entry(root, textvariable=numbervar , justify=CENTER,relief=SUNKEN,cursor="pencil", takefocus=True) 
entry2.bind("<0>", callback)

Notice2 = Label(root, text="your secret number must be between 1 and 9!!!", font=notice, bg="#ffefd5", fg="#0000ff", justify=CENTER)

img = ImageTk.PhotoImage(Image.open("Koalalogo.jpg"))
panel = Label(root, image = img, relief=SUNKEN)

correct= Label(root, text="Check the below details \n\n Click \'yes\' if they are correct \n\n Click \'No\' to go back \n\n", font=Body1, bg="#ffefd5")
yourwebsite = Label(root, text="The Website is  :", font=Body, bg="#ffefd5")#
website1 = Label(root,  font=Body2, bg="#ffefd5",fg= "#00009C", textvariable = website)#
yourpassword = Label(root, text="Your Password is:", font=Body, bg="#ffefd5")
yournumber1= Label(root, font=Body2, bg="#ffefd5",textvariable = numbervar , fg= "#00009C", )
yourpassword1 = Label(root, font=Body2, bg="#ffefd5",textvariable = passwordvar , fg= "#00009C", )
yournumber= Label(root, text="Your Secret Number is:", font=Body, bg="#ffefd5")

def restart():
    Titlemsg.grid_forget()
    correct.grid_forget()
    yourwebsite.grid_forget()
    website1.grid_forget()
    yourpassword.grid_forget()
    yourpassword1.grid_forget()
    yournumber.grid_forget()
    yournumber1.grid_forget()
    panel.grid_forget()
    toolbar.grid_forget()
    yes.grid_forget()
    no.grid_forget()
    entry.delete(0,END)
    entry1.delete(0,END)
    entry2.delete(0,END)
    Titlemsg.grid( row=7, pady=25, sticky=N+S+E+W)
    startpic.grid( row=10,pady=25, )
    Head.grid( row=14, pady=25, columnspan=2, sticky=N+S+E+W)
    toolbar.grid( row=21, )
    end.grid(column =3, row=1, sticky=N+S+E+W)    
    begin.grid(column =2, row=1, sticky=N+S+E+W) 

def start():
    #entry.destroy()
    #entry1.destroy()
    #entry2.destroy()
    toolbar.grid_forget()
    Titlemsg.grid_forget()
    begin.grid_forget()
    Head.grid_forget()
    startpic.grid_forget()   
    web.grid(row=3, column=0, sticky= W+E)
    entry.grid( row=3, column=1, padx=50)
    passw.grid(row=10, column=0)
    Notice1.grid(row=4, sticky=N+S+E+W, columnspan=2)
    entry1.grid(row=10, column=1)
    Notice.grid(row=11,column=0, columnspan=2,)
    secret.grid(row=13, column=0)
    entry2.grid( row=13, column=1)
    Notice2.grid( row=14,column=0, columnspan=2,)
    panel.grid(row=20,columnspan=2, pady=70)
    confirm.grid(column =1, row=1)
    reset.grid(column =2, row=1)
    end.grid(column =3, row=1)
    toolbar.grid(row=21, column=0, columnspan=2)
    Titlemsg.grid(row=0, column=0, columnspan=2, sticky=E+W)

def Reset():
   entry.delete(0,END)
   entry1.delete(0,END)
   entry2.delete(0,END)

def clear_text():
    #entry.destroy()
    #entry1.destroy()
    #entry2.destroy()
    panel.grid_forget()
    entry.grid_forget()
    entry1.grid_forget()
    entry2.grid_forget()
    web.grid_forget()
    Notice.grid_forget()
    passw.grid_forget()
    secret.grid_forget()
    Notice1.grid_forget()
    Notice2.grid_forget()
    confirm.grid_forget()
    reset.grid_forget()
    toolbar.grid_forget()
    Titlemsg.grid_forget()
    Titlemsg.grid(row=0, column=0, columnspan=2, sticky=E+W)
    correct.grid(row=1, column=0, columnspan=2, sticky=E+W)
    yourwebsite.grid(row=2,column=0,sticky=E+W, pady=5)
    website1.grid(row=2, column=1, padx=65,sticky=E+W, pady=5)
    yourpassword.grid(row=4, column=0,sticky=E+W, pady=5)
    yourpassword1.grid(row=4, column=1, padx=65,sticky=E+W, pady=5)
    yournumber.grid(row=6, column=0,sticky=E+W, pady=5)
    yournumber1.grid(row=6, column=1, padx=65,sticky=E+W, pady=5)
    panel.grid(row=8, column=0, columnspan=2, pady=50)
    toolbar.grid(row=10, column=0, columnspan=2)
    yes.grid(column =1, row=1)
    no.grid(column =2, row=1)

def popup():
    top = Toplevel(bg="#ffefd5")
    top.title("Koala Encrypter")
    popuptitle = Label(top, text="Your password is:", font=Body1, fg="red", bg="#ffefd5")
    popuptitle.grid(row = 2,column=0, padx=5, pady = 50,sticky=N+S+E+W)
    pwd= Label(top, font=Body2, text="password", bg="#ffefd5", fg= "#00009C", ) #textvariable = newpassword ,
    pwd.grid(row= 2, column=1,sticky=E+W,padx=15)
    button = Button(top, text="OK", command=top.destroy, relief=RAISED )
    button.grid(column =0,columnspan=2, row=4, sticky=N+S+E+W)

def helpmsg():
    top = Toplevel(bg="#ffefd5")
    top.title("Koala Encrypter")
    popuptitle = Label(top, text="Koala series 1.0 - Koala Encrypter", font=Title, bg="#00FA9A", relief=RAISED,)
    popuptitle.grid(row = 2,column=0, padx=5, pady = 50,sticky=N+S+E+W)
    pwd= Label(top, font=Body, text="Free software to help you keep your acounts safe", bg="#ffefd5") 
    pwd.grid(row= 1,sticky=E+W,)   
    Titlems = Label(top, text="Koala Encrypter", font=Title, bg="#00FA9A", relief=RAISED,)
    Titlems.grid( row=0, pady=25, sticky=N+S+E+W)
    button = Button(top, text="OK", command=top.destroy, relief=RAISED )
    button.grid(column =0,columnspan=2, row=4, sticky=N+S+E+W)

max_len = 5      

def on_write(*args):
     s = website.get()
     if len(s) > max_len:
          website.set(s[:max_len])

website.trace_variable("w", on_write)

max_len1 = 5      
def on_write(*args):
     s = passwordvar.get()
     if len(s) > max_len1:
          passwordvar.set(s[:max_len1])

passwordvar.trace_variable("w", on_write)

max_len2 = 1      

def on_write(*args):
     s = numbervar.get()
     if len(s) > max_len2:
          numbervar.set(s[:max_len2])
numbervar.trace_variable("w", on_write)

toolbar = Frame(root)
reset = Button(toolbar, text="Reset", width=6, command=Reset, cursor="cross", relief=RAISED, takefocus=True )

end = Button(toolbar, text="Quit" ,command=root.destroy, relief=RAISED, cursor="X_cursor", takefocus=True)
end.grid(column =3, row=1, sticky=N+S+E+W)
begin = Button(toolbar, text="Start Encrypting", command=start, relief=RAISED, cursor="star",takefocus=True )
begin.grid(column =2, row=1, sticky=N+S+E+W)
confirm = Button(toolbar, text="Next", command =clear_text,  cursor="star", relief=RAISED,takefocus=True  )

yes = Button(toolbar, text="Yes", command =popup,  cursor="star",  relief=RAISED,takefocus=True  )

no = Button(toolbar, text="No", command =restart,  cursor="pirate", relief=RAISED, takefocus=True  )
toolbar.grid( row=21, )

menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Restart", command=restart)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.destroy)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu, )
helpmenu.add_command(label="About...", command=helpmsg)

app = root
root.mainloop()

# add functionality,  fix validation

【问题讨论】:

  • 使用.get()StringVar 获取普通的Python string,用这个string 做你想做的事——你甚至可以转换为字符列表——最后放上新的@使用.set() 将987654327@ 转换为StringVar(如果您有字符列表,则使用join() 转换为string)。顺便说一句:如果你不想要它,你不必使用StringVar。您可以直接从 Entry - entry.get() 获取文本
  • Entry 有选项 validatecommand= 并且您可以设置检查文本的功能 - effbot.org/tkinterbook/entry.htm
  • 顺便说一句:我们仅对类使用 CamelCase 名称 - 以使代码更具可读性(请参阅:按钮、标签等)。对于变量和函数,我们使用lower_case 名称。
  • 我试过 get() 但它仍然给出错误,getitem 或类似的东西。至于 validate 命令,我不知道如何使用它,虽然我已经研究过了,但最后我仍然需要 stringvar 作为字符串,让我可以访问它的索引(索引),但我不确定怎么做。我已经用尽了互联网上的所有资源来尝试这样做。我认为这可能只是因为我没有理解我一直在阅读的链接上给出的信息的知识。如何直接使用文本,如果我使用文本,它不会让我将数据输出到标签中?什么是 CamelCase?
  • 当我写.get() 以点开头时,我的意思是text = password.get()text = websit.get() 等。同样的password.set(text)website.set(text) 等。

标签: python list tkinter tkinter-entry


【解决方案1】:

要限制可以输入到条目小部件中的字符类型/数量,您可以使用 entry validate 命令。这是一个仅允许字母和另一个将条目限制为 4 位数字的示例:

from tkinter import Tk, Entry, Label

def only_letters(action, char):
    if action == "1":
        # a character is inserted (deletion is 0) allow the insertion 
        # only if the inserted character char is a letter
        return char.isalpha()
    else:
        # allow deletion
        return True

def only_numbers_max_4(action, new_text):
    if action == "1":
        return new_text.isdigit() and len(new_text) <= 4
    else:
        return True

root = Tk()
# register validate commands
validate_letter = root.register(only_letters)
validate_nb = root.register(only_numbers_max_4)

Label(root, text="Only letters: ").grid(row=0, column=0)
e1 = Entry(root, validate="key", validatecommand=(validate_letter, '%d', '%S'))
# %d is the action code and %S the inserted/deleted character
e1.grid(row=0, column=1)

Label(root, text="Only numbers, at most 4: ").grid(row=1, column=0)
e2 = Entry(root, validate="key", validatecommand=(validate_nb, '%d', '%P'))
# %P is the new content of the entry after the modification
e2.grid(row=1, column=1)

root.mainloop()

有关条目验证的更多详细信息,请参阅http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多