使用StringVar数据作为列表 [英] Using StringVar data as a list

查看:126
本文介绍了使用StringVar数据作为列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've been following this website for a while. It is really helpful. So, thanks for all the useful tips.

过去两个星期,我一直在寻找这个答案,但没有成功,所以现在我不得不从目前的障碍中完全摆脱沮丧.

I've been searching for this answer for the past two weeks without any success, so now I'm compelled to ask out of total frustration with my current obstacle.

如何将StringVar用作列表?

How do you use StringVar as a list?

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

Basically, I was coding the following program for my wife. The code is pretty messy as it is my first program I've tried to code.

我的想法是我将采用3个变量.密码,机密号码和网站,然后使用if语句和列表对它们进行一些处理,以创建唯一的密码.

The idea was that I would take 3 variables; password, secret number and website and then do some work on them using if statements and lists to create a unique password.

第一个问题是我不能限制输入小部件的字符长度,但最终我解决了这个问题,但我仍然想限制可以输入的字符.

First problem was that I couldn't restrict the character length of the entry widgets but in the end i solved that but i still want to limit the characters that can be input.

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

for instance in the website entry box, i want to allow only letters.

如果我可以将StringVar转换为列表,则可以处理杂乱的if语句,以允许每个索引中仅允许某些字符,但我尝试过的所有方法都说stringvars不能用作列表.

If I could convert StringVar to a list, I could do some work with messy if statements to allow only certain characters in each index but everythime i try it says that stringvars cant be used as a list.

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

I need them as a list to limit the type of characters that can be entered and also so that i can do work on the variables to get the final output.

代码:

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

推荐答案

要限制可以在输入小部件中键入的字符的类型/数量,可以使用entry validate命令.下面是一个示例,该示例仅允许字母输入,而另一个字母只能将输入限制为4位数字:

To restrict the type/number of characters that can be typed into an entry widget, you can use the entry validatecommand. Here is an example to allow only letters and another one to restrict the entry to 4 digits:

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

For more details on entry validation, see http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html

这篇关于使用StringVar数据作为列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆