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.
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.
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.
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.
CODE:
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
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()
For more details on entry validation, see http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html
Related
I want to code a searchable ttk.Treeview; however, my code does not behave properly. When I type in and click search nothing happens. What should be improved so the searched items are highlighted when I type in?
from tkinter import *
from tkinter import ttk
root = Tk()
root.title("Medicine database")
def add():
tree.insert("",END,values=("",e1.get()))
def search(item=''):
children = tree.get_children(item)
for child in children:
text = tree.item(child, 'text')
if text.startswith(e1.get()):
tree.selection_set(child)
return True
else:
res = search(child)
if res:
return True
lb1 = Label(root,text="Search:")
lb1.grid(row =0,column=0,padx=10,pady=10,sticky=W)
e1=Entry(root,width=15)
e1.grid(row=0,column=1,padx=10,pady=10,sticky=E,rowspan=1)
btn = Button(root,text="search",width=10,command=search)
btn.grid(row =0,column=0,padx=10,pady=10,rowspan=2)
btn1 = Button(root,text="add",width=10,command=add)
btn1.grid(row =1,column=0,padx=10,pady=10,rowspan=2)
#treeview
tree = ttk.Treeview(root,height=25)
tree["columns"]=("one","two","three","four")
tree.column("one",width=120)
tree.column("two",width=160)
tree.column("three",width=130)
tree.column("four",width=160)
tree.heading("one", text="Numer seryjny leku")
tree.heading("two", text="Nazwa Leku")
tree.heading("three", text="Ampułki/Tabletki")
tree.heading("four",text="Data ważności")
tree["show"]="headings"
tree.grid(row=0,column=2,rowspan=6,pady=20)
root.geometry("840x580")
root.mainloop()
As it was, your search method did nothing.
First, you probably need to have an entry for adding items and another for searching them.
Then, in the search method, you must retrieve the query from the search entry, match it with then tree children values, and return (here we will print) the values if you find a match, and highlight them in the Treeview.
import tkinter as tk
from tkinter import ttk
def add():
value = add_entry.get()
values.append(value)
tree.insert("", tk.END, values=(f'#{len(values)}', value, 'more', 'moar'))
def search():
query = search_entry.get()
selections = []
for child in tree.get_children():
if query in tree.item(child)['values']:
print(tree.item(child)['values'])
selections.append(child)
print('search completed')
tree.selection_set(selections)
values = []
root = tk.Tk()
root.title("Medicine database")
lb1 = tk.Label(root, text="Search:")
lb1.grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)
search_entry = tk.Entry(root, width=15)
search_entry.grid(row=0, column=1, padx=10, pady=10, sticky=tk.E, rowspan=1)
btn = tk.Button(root, text="search", width=10, command=search)
btn.grid(row=0, column=0, padx=10, pady=10, rowspan=2)
add_lb = tk.Label(root, text="add:")
add_lb.grid(row=1, column=0, padx=10, pady=10, sticky=tk.W)
add_entry = tk.Entry(root, width=15)
add_entry.grid(row=1, column=1, padx=10, pady=10, sticky=tk.E, rowspan=1)
btn1 = tk.Button(root, text="add", width=10, command=add)
btn1.grid(row=1, column=0, padx=10, pady=10, rowspan=2)
# treeview
tree = ttk.Treeview(root, height=25)
tree["columns"] = ("one", "two", "three", "four")
tree.column("one", width=120)
tree.column("two", width=160)
tree.column("three", width=130)
tree.column("four", width=160)
tree.heading("one", text="Numer seryjny leku")
tree.heading("two", text="Nazwa Leku")
tree.heading("three", text="Ampułki/Tabletki")
tree.heading("four", text="Data ważności")
tree["show"]="headings"
tree.grid(row=0, column=2, rowspan=6, pady=20)
root.geometry("840x580")
if __name__ == '__main__':
root.mainloop()
from tkinter import *
def tell_story(Male):
story= "My name is" + "Male"
Frame.story_txt.delete(0.0, END)
Frame.story_txt.insert(0.0, story)
root = Tk()
root.title("game")
root.geometry("800x400")
Application = Frame(root)
Application.grid()
Lbl1 = Label(Application, text="story").grid(row=0, column=0, sticky=W)
Lbl2 = Label(Application, text="Male name").grid(row=1, column=0, sticky=W)
Male = Entry(Application).grid(row=1, column=1, sticky=W)
Button(Application, text="Click for story", command=tell_story).grid(row=11, column=0, sticky=W)
Frame.story_txt = Text(Application, width=75, height=10, wrap=WORD)
Frame.story_txt.grid(row=12, column=0, columnspan=4)
root.mainloop()
I'm unable to print story variable in text widget
This is my first post so please have patience
I've got a school assignment to create an art supplies application and I've drawn a blank why my tkinter scale values are not saving to a file.
The customer details and submit button code works as expected (saves to a file = info.txt)
The Order tab page doesn't work as expected = does not append info.txt with specific quantities of art supplies ordered
Here's my code
#def mainmenu():
from tkinter import *
from tkinter import ttk
import re
NON_ALPHA_RE = re.compile('[^A-Z0-9]+')
POSTCODE_RE = re.compile('^[A-Z]{1,2}[0-9]{1,2}[A-Z]? [0-9][A-Z]{2}$')
def normalise_postcode(eZIP_Postalcode):
eZIP_Postalcode = NON_ALPHA_RE.sub('', eZIP_Postalcode.upper())
eZIP_Postalcode = eZIP_Postalcode[:-3] + ' ' + eZIP_Postalcode[-3:]
if POSTCODE_RE.match(eZIP_Postalcode):
return eZIP_Postalcode
return None
def submit() :
invalidtext_1.set("")
invalidtext_2.set("")
invalidtext_3.set("")
invalidtext_4.set("")
invalidtext_5.set("")
eName =Name.get()
eSurname =Surname.get()
ecountry =country.get()
ecity =city.get()
eAddressLine1 = AddressLine1.get()
eAddressLine2 = AddressLine2.get()
eState_Province_Region = State_Province_Region.get()
eZIP_Postalcode = ZIP_Postalcode.get()
valid = True
if eName.isalpha() == False:
invalidtext_1.set("Invalid forename. Please use letters only.")
valid = False
if eSurname.isalpha() == False:
invalidtext_2.set("Invalid surname. Please use letters only.")
valid = False
if ecountry.isalpha() == False:
invalidtext_3.set("Invalid country name. Please use letters only.")
valid = False
if ecity.isalpha() == False:
invalidtext_4.set("Invalid city name. Please use letters only.")
valid = False
if eZIP_Postalcode != normalise_postcode(eZIP_Postalcode):
invalidtext_5.set("Please enter a valid postcode.")
valid = False
if valid == False:
return
else:
eName = eName.ljust(150)
eSurname = eSurname.ljust(150)
ecountry = ecountry.ljust(150)
ecity = ecity.ljust(150)
eAddressLine1 = eAddressLine1.ljust(150)
eAddressLine2 = eAddressLine2.ljust(150)
eState_Province_Region = eState_Province_Region.ljust(150)
eZIP_Postalcode = eZIP_Postalcode.ljust(150)
fileObject = open("Info.txt","a")
fileObject.write(eName +"\n" + eSurname +"\n" + ecountry +"\n" + ecity +"\n" + eAddressLine1 +"\n" + eAddressLine2 +"\n" + eState_Province_Region +"\n" + eZIP_Postalcode +"\n")
fileObject.close()
return
def submitNumber():
Paint=Paint.get()
Paper=Paper.get()
PaintBrush =PaintBrush.get()
Easles=Easles.get()
Pencils=Pencils.get()
Paint = Paint.ljust(150)
Paper = Paper.ljust(150)
PaintBrush = PaintBrush.ljust(150)
Easles = Easles.ljust(150)
Pencils = Pencils.ljust(150)
fileObject = open("Info.txt","a")
fileObject.write(paint + paper + paintbrush + Easles + pencils +"\n")
fileObject.close()
def mainWindow():
global Name, invalidtext_1, frame1, invalidtext_2,Surname,city,country,invalidtext_3,invalidtext_4,AddressLine1,AddressLine2,State_Province_Region,ZIP_Postalcode,invalidtext_5
window=Tk()
window.title("Artist Products")
window.configure(background = "#800000")
window.resizable(width=True, height=True)
# DON'T NEED window.geometry("500x300") #Width x Height
tab_control = ttk.Notebook(window)
tab1 = ttk.Frame(tab_control)
#Tab 1 (as in the number 1!)
tab_control.add(tab1, text='Customer details')
Label (tab1, text="Name:" , bg="#800", fg="white", font="futuran 12").grid(row=1, column=0)
Name=StringVar()
eName=Entry(tab1, textvariable=Name)
eName.grid(row=1, column=1)
invalidtext_1=StringVar()
invalid_1= Label(tab1, textvariable=invalidtext_1, font="Helvetica 12 ", fg="red")
invalid_1.grid(row=1,column=2, sticky=W)
Label (tab1, text="Surname:" , bg="#800", fg="white", font="futuran 12").grid(row=2, column=0)
Surname=StringVar()
eSurname=Entry(tab1, textvariable=Surname)
eSurname.grid(row=2, column=1)
invalidtext_2=StringVar()
invalid_2= Label(tab1, textvariable=invalidtext_2, font="Helvetica 12 ", fg="red")
invalid_2.grid(row=2,column=2, sticky=W)
Label (tab1, text="Adress Line 1:" , bg="#800", fg="white", font="futuran 12").grid(row=3, column=0)
AddressLine1=StringVar()
eAddressLine1=Entry(tab1, textvariable=AddressLine1)
eAddressLine1.grid(row=3, column=1)
Label (tab1, text="Adress Line 2:" , bg="#800", fg="white", font="futuran 12").grid(row=4, column=0)
AddressLine2=StringVar()
eAddressLine2=Entry(tab1, textvariable=AddressLine2)
eAddressLine2.grid(row=4, column=1)
Label (tab1, text="State/province/region:" , bg="#800", fg="white", font="futuran 12").grid(row=5, column=0)
State_Province_Region=StringVar()
eState_Province_Region=Entry(tab1, textvariable=State_Province_Region)
eState_Province_Region.grid(row=5, column=1)
Label (tab1, text="ZIP/postal code:" , bg="#800", fg="white", font="futuran 12").grid(row=6, column=0)
ZIP_Postalcode=StringVar()
eZIP_Postalcode=Entry(tab1, textvariable=ZIP_Postalcode)
eZIP_Postalcode.grid(row=6, column=1)
invalidtext_5=StringVar()
invalid_5= Label(tab1, textvariable=invalidtext_5, font="Helvetica 12 ", fg="red")
invalid_5.grid(row=6,column=2, sticky=W)
Label (tab1, text="Country name:" , bg="#800", fg="white", font="futuran 12").grid(row=7, column=0)
country=StringVar()
ecountry=Entry(tab1, textvariable=country)
ecountry.grid(row=7, column=1)
invalidtext_3=StringVar()
invalid_3= Label(tab1, textvariable=invalidtext_3, font="Helvetica 12 ", fg="red")
invalid_3.grid(row=7,column=2, sticky=W)
Label (tab1, text="City:" , bg="#800", fg="white", font="futuran 12").grid(row=8, column=0)
city=StringVar()
ecity=Entry(tab1, textvariable=city)
ecity.grid(row=8, column=1)
invalidtext_4=StringVar()
invalid_4= Label(tab1, textvariable=invalidtext_4, font="Helvetica 12 ", fg="red")
invalid_4.grid(row=8,column=2, sticky=W)
####Tab 2
tab2 = ttk.Frame(tab_control)
tab_control.add(tab2, text='View All Products')
Label (tab2, text='Paper(50 pages non lined):£3',bg="#800", fg="white", font="futuran 12").grid(row=1, column=0)
Paper = Scale(tab2, from_=0, to=100, orient=HORIZONTAL)
Paper.grid(row=1, column=1)
Label (tab2, text='Paint (acrylic):£6' ,bg="#800", fg="white", font="futuran 12").grid(row=2, column=0)
Paint = Scale(tab2, from_=0, to=100, orient=HORIZONTAL)
Paint.grid(row=2, column=1)
Label (tab2, text='Paint brush:£4' ,bg="#800", fg="white", font="futuran 12").grid(row=3, column=0)
PaintBrush = Scale(tab2, from_=0, to=100, orient=HORIZONTAL)
PaintBrush.grid(row=3, column=1)
Label (tab2, text='Easels:£6' ,bg="#800", fg="white", font="futuran 12").grid(row=4, column=0)
Easels = Scale(tab2, from_=0, to=100, orient=HORIZONTAL)
Easels.grid(row=4, column=1)
Label (tab2, text='Pencils:£4.50' ,bg="#800", fg="white", font="futuran 12").grid(row=5, column=0)
Pencils = Scale(tab2, from_=0, to=100, orient=HORIZONTAL)
Pencils.grid(row=5, column=1)
#Tab 3
tab3 = ttk.Frame(tab_control)
tab_control.add(tab3, text='Invoices')
tab_control.grid(row=1, column=1)
#Tab 4
tab4 = ttk.Frame(tab_control)
tab_control.add(tab4, text='Basket')
tab_control.grid(row=1, column=1)
Label (tab4, text="Basket",bg="#800", fg="white", font="futuran 12").grid(row=1, column=0)
#Tab 5
tab5 = ttk.Frame(tab_control)
tab_control.add(tab5, text='Orders')
tab_control.grid(row=1, column=1)
#buttons
b6=Button(tab1, text="Close",command=quit, width=10)
b6.grid(row=12, column=0)
b6=Button(tab2, text="Close",command=quit, width=10)
b6.grid(row=12, column=0)
b6=Button(tab3, text="Close",command=quit, width=10)
b6.grid(row=12, column=0)
b6=Button(tab4, text="Close",command=quit, width=10)
b6.grid(row=12, column=0)
b6=Button(tab5, text="Close",command=quit, width=10)
b6.grid(row=12, column=0)
b18= Button(tab1, text=" Submit ",command=submit,width=10)
b18.grid(row=12, column=1)
b17= Button(tab2, text=" Submit ",command=submit,width=10)
b17.grid(row=12, column=1)
frame2 = Frame(window)
frame2.grid()
return window
window = mainWindow()
window.mainloop()
mainWindow()
I've also tried to get the customer details submit button to save to the file and then close down the customer details tab or ar least move the focus to the 'View all products' tab (so that the user can then concentrate on their order).
Help!
It looks like your problem is one of variable names. You are clobbering the scale object with the result of a call to get(), but then you write to what I assume was the variable you intended to assign. That variable is never initialized and is therefore None, so nothing is written to the file.
e.g.
Paint = Paint.get()
...
Paint = Paint.ljust(150)
...
fileObject.write(... + paint + ...)
should be
paint = Paint.get()
...
paint = Paint.ljust(150)
...
fileObject.write(... + paint)
What I want the frame to do is that when I click on the 'clear' button, the frame is cleaned but it does not and when I enter a string that is not valid and then a valid one, it shows traces of the past and past action. I already tried changing the Label.grid () by a Label.pack (), but it is worse since the 'animation' looks like a stack without removing any element when the 'clear' button is pressed
This is basically what would make it change
from tkinter import *
import tkinter.ttk as ttk
def clear():
area.delete(0,END)
frame.config(bd=1, relief=SUNKEN)
frame.update()
status = Label(frame)
status.grid(row=0, column=0, sticky=NSEW)
def statusVal(value):
if not value == 0:
status = Label(frame, background="#ff4242", fg="#262626", text="Cadena invalida", anchor="center")
status.grid(row=0, column=0)
frame.config(bd=1, relief=SUNKEN, background="#ff4242")
frame.update()
else:
status = Label(frame, background="#56ed42", fg="#262626", text="Cadena valida", anchor="center")
status.grid(row=0, column=0)
frame.config(bd=1, relief=SUNKEN, background="#56ed42")
frame.update()
#Test
def validation():
capture = area.get()
if capture == '1':
return statusVal(0)
else:
return statusVal(1)
root = Tk()
root.geometry("300x150+300+300")
area = Entry(root)
area.grid(row=1, column=0, columnspan=2, sticky=E+W+S+N, padx=5)
frame = Frame(root, bd=1, relief=SUNKEN)
frame.grid(row=2, column=0, padx=5, pady=5, columnspan=2, sticky=W+E+S+N)
frame.columnconfigure(0,weight=5)
frame.rowconfigure(0,weight=5)
abtn = Button(root, text="Validate", command=validation)
abtn.grid(row=1, column=3)
cbtn = Button(root, text="Clear", command=clear)
cbtn.grid(row=2, column=3, pady=5)
root.mainloop()
See if this works better. The main change was to have the status Label always exist and hide or unhide it as desired — instead of creating a new one every time the validation() function was called. I also removed the code that was explicitly updating the frame which isn't necessary.
from tkinter import *
import tkinter.ttk as ttk
def clear():
area.delete(0,END)
status.grid_remove() # Hide. but remember grid options.
def statusVal(value):
if not value == 0:
status.config(background="#ff4242", fg="#262626", text="Cadena invalida",
anchor="center")
status.grid() # Unhide
else:
status.config(background="#56ed42", fg="#262626", text="Cadena valida",
anchor="center")
status.grid() # Unhide
#Test
def validation():
capture = area.get()
if capture == '1':
statusVal(0)
else:
statusVal(1)
# Main
root = Tk()
root.geometry("300x150+300+300")
area = Entry(root)
area.grid(row=1, column=0, columnspan=2, sticky=E+W+S+N, padx=5)
frame = Frame(root, bd=1, relief=SUNKEN)
frame.grid(row=2, column=0, padx=5, pady=5, columnspan=2, sticky=W+E+S+N)
frame.columnconfigure(0,weight=5)
frame.rowconfigure(0,weight=5)
# Initialize status Label.
status = Label(frame, anchor="center")
status.grid(row=0, column=0)
status.grid_remove() # Hide it.
abtn = Button(root, text="Validate", command=validation)
abtn.grid(row=1, column=3)
cbtn = Button(root, text="Clear", command=clear)
cbtn.grid(row=2, column=3, pady=5)
root.mainloop()
In the code given below, I want to create a GUI in such a way that 1) In the top frame: 1st row : "x"(checkbutton), right to "x"(checkbutton) must be "Choose xFile"(button) and right to "Choose xFile"(button) must be "clear"(button) and likewise in the 2nd row : for "y". Only when the "x" checkbutton is checked, the "choose xFile" button should gets enabled. And when clicked upon "choose xFile", it has to open the file dialogbox. And the choosen file contents should get displayed using "description box" below the "Input data"(label) in the middle frame(with both horizontal and vertical scrollbar). And when "clear" button is clicked, only the selected file contents(x or y file choosen) in the "description box" must be cleared and it must enable the "Choose xFile"(button) or "Choose yFile"(button) to perform the task again(i.e to open the file dialog box). Below to the "description box" must contain "Reset" button and to the right of "Reset" button must be "Submit" button in the middle portion of the middle frame. When the "Reset" button is clicked, all the contents being displayed in the "description box" must be cleared and the all the checkboxes must be unchecked so that the user can perform the selection process again. In the bottom frame, below "Model Output"(label), a "description box" along with "horizontal" and "vertical" scrollbar must be there. Below to the "description box" must contain "Exit" button which is placed in the middle of the "bottom frame".
from tkinter import *
def forButton1():
filename1 = askopenfilename()
with open(filename1) as f:
for i in f:
myList.insert(END, i)
print(filename1)
def forButton2():
filename1 = askopenfilename()
with open(filename1) as f:
for i in f:
myList.insert(END, i)
print(filename1)
def forButton7():
root.destroy()
root = Tk()
root.title("Spatialization of DSSAT")
topFrame = LabelFrame(root, text = "Select input file")
MyVar1 = IntVar()
MyVar2 = IntVar()
MyCheckbutton1 = Checkbutton(topFrame, text="x", variable=MyVar1)
#MyCheckbutton1.grid(row=0, column=0)
MyCheckbutton1.pack()
MyCheckbutton2 = Checkbutton(topFrame, text="y", variable=MyVar2)
#MyCheckbutton2.grid(row=1, column=0)
MyCheckbutton2.pack()
Button1 = Button(topFrame, text = "Choose xFile", command = forButton1)
#button1.grid(row=0, column=1)
Button1.pack()
Button2 = Button(topFrame, text = "Choose yFile", command = forButton2)
#button2.grid(row=0, column=1)
Button2.pack()
Button3 = Button(topFrame, text = "Clear")
Button3.pack()
Button4 = Button(topFrame, text = "Clear")
Button4.pack()
topFrame.pack(side=TOP)
middleFrame = Frame(root)
label1 = Label(middleFrame, text = "Input data:")
label1.grid(row = 4)
scrollbar = Scrollbar(middleFrame)
myList = Listbox(middleFrame, yscrollcommand = scrollbar.set)
myList.pack()
scrollbar.config( command = myList.yview )
scrollbar.pack()
Button5 = Button(middleFrame, text = "Reset")
#button1.grid(row=0, column=1)
Button5.pack()
Button6 = Button(middleFrame, text = "Submit")
#button1.grid(row=0, column=1)
Button6.pack()
middleFrame.pack()
bottomFrame = Frame(root)
label2 = Label(bottomFrame, text = "Model Output:")
label2.grid(row = 10)
Button7 = Button(bottomFrame, text = "Exit", command = forButton7)
#button1.grid(row=0, column=1)
Button7.pack()
bottomFrame.pack()
root.geometry("500x500")
root.mainloop()
Here I have fixed the placement of the given widgets (not their functionalities) as asked in question. You can follow this way to get your desired format:
from tkinter import *
from tkinter import filedialog
def forButton1():
filename1 = filedialog.askopenfilename()
with open(filename1) as f:
for i in f:
myList.insert(END, i)
print(filename1)
def forButton2():
filename1 = filedialog.askopenfilename()
with open(filename1) as f:
for i in f:
myList.insert(END, i)
print(filename1)
def forButton7():
root.destroy()
root = Tk()
root.title("Spatialization of DSSAT")
root.grid_columnconfigure(0, weight=1)
topFrame = LabelFrame(root, text="Select input file")
topFrame.grid(row=0, column=0, padx=8, pady=8, sticky=N+E+S+W)
topFrame.grid_rowconfigure(0, weight=1)
topFrame.grid_rowconfigure(1, weight=1)
topFrame.grid_columnconfigure(0, weight=1)
topFrame.grid_columnconfigure(1, weight=1)
topFrame.grid_columnconfigure(2, weight=1)
middleFrame = LabelFrame(root, text="Input data")
middleFrame.grid(row=1, column=0, padx=8, pady=8, sticky=N+E+S+W)
middleFrame.grid_rowconfigure(0, weight=1)
middleFrame.grid_rowconfigure(1, weight=0)
middleFrame.grid_columnconfigure(0, weight=1)
middleFrame.grid_columnconfigure(1, weight=1)
bottomFrame = LabelFrame(root, text="Model Output")
bottomFrame.grid(row=2, column=0, padx=8, pady=8, sticky=N+E+S+W)
bottomFrame.grid_rowconfigure(0, weight=1)
bottomFrame.grid_columnconfigure(0, weight=1)
MyVar1 = IntVar()
MyVar2 = IntVar()
MyCheckbutton1 = Checkbutton(topFrame, text="x", variable=MyVar1)
MyCheckbutton1.grid(row=0, column=0, padx=4, pady=4)
Button1 = Button(topFrame, text="Choose xFile", command=forButton1)
Button1.grid(row=0, column=1, padx=4, pady=4)
Button3 = Button(topFrame, text="Clear")
Button3.grid(row=0, column=2, padx=4, pady=4)
MyCheckbutton2 = Checkbutton(topFrame, text="y", variable=MyVar2)
MyCheckbutton2.grid(row=1, column=0, padx=4, pady=4)
Button2 = Button(topFrame, text="Choose yFile", command=forButton2)
Button2.grid(row=1, column=1, padx=4, pady=4)
Button4 = Button(topFrame, text="Clear")
Button4.grid(row=1, column=2, padx=4, pady=4)
innerMiddleFrame = Frame(middleFrame)
innerMiddleFrame.grid(row=0, column=0, columnspan=2, padx=4, pady=4)
innerMiddleFrame.grid_columnconfigure(0, weight=1)
innerMiddleFrame.grid_columnconfigure(1, weight=0)
scrollbar = Scrollbar(innerMiddleFrame)
myList = Listbox(innerMiddleFrame, yscrollcommand=scrollbar.set)
myList.grid(row=0, column=0, sticky=N+E+S+W)
scrollbar.config(command=myList.yview)
scrollbar.grid(row=0, column=1, sticky=N+E+S+W)
Button5 = Button(middleFrame, text="Reset")
Button5.grid(row=1, column=0, padx=4, pady=4)
Button6 = Button(middleFrame, text="Submit")
Button6.grid(row=1, column=1, padx=4, pady=4)
Button7 = Button(bottomFrame, text="Exit", command=forButton7)
Button7.grid(row=0, column=0, padx=4, pady=4)
root.geometry("250x425")
root.mainloop()