Reputation: 65
from tkinter import *
from tkinter import ttk
import mysql.connector
from tkinter import messagebox
mydb = mysql.connector.connect(host="localhost", user="root", passwd="")
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE IF NOT EXISTS STUDENT_RECORDS")
mycursor.execute("USE STUDENT_RECORDS")
mycursor.execute("CREATE TABLE IF NOT EXISTS STU (ROLL_NO INT, NAME VARCHAR(255), EMAIL VARCHAR(255), GENDER VARCHAR(255), CONTACT VARCHAR(255), DOB VARCHAR(255), ADDRESS VARCHAR(255))")
class Students:
def __init__(self, root):
self.root = root
self.root.title("Student Management System")
self.root.geometry("1350x700+0+0")
color = "blue"
title = Label(self.root, text="Student Management System", bd=10, relief=GROOVE, font=("times new roman", 40, "bold"), bg="yellow", fg="red")
title.pack(side=TOP, fill=X)
#=================All Variables
self.Roll_no_var = StringVar()
self.name_var = StringVar()
self.email_var = StringVar()
self.gender_var = StringVar()
self.contact_var = StringVar()
self.dob_var = StringVar()
self.searchby_var = StringVar()
self.searchtxt_var = StringVar()
#=================MANAGE FRAME
self.Manage_Frame = Frame(self.root, bd=4, relief=RIDGE, bg=color)
self.Manage_Frame.place(x=20,y=100,width=450,height=600)
m_title = Label(self.Manage_Frame, text="Manage Students", bd=10, font=("times new roman", 30, "bold"), bg=color, fg="white")
m_title.grid(row=0,columnspan=2,pady=20)
lbl_roll = Label(self.Manage_Frame, text="ROLL NO.", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_roll.grid(row=1, column=0, pady=10, padx=20, sticky="w")
txt_roll = Entry(self.Manage_Frame, textvariable=self.Roll_no_var, font=("times new roman", 15, "bold"), bd=5, relief=GROOVE)
txt_roll.grid(row=1, column=1, pady=10, padx=20, sticky="w")
lbl_name = Label(self.Manage_Frame, text="Name", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_name.grid(row=2, column=0, pady=10, padx=20, sticky="w")
print(type(lbl_name))
txt_name = Entry(self.Manage_Frame, textvariable=self.name_var, font=("times new roman", 15, "bold"), bd=5, relief=GROOVE)
txt_name.grid(row=2, column=1, pady=10, padx=20, sticky="w")
lbl_Email = Label(self.Manage_Frame, text="Email", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_Email.grid(row=3, column=0, pady=10, padx=20, sticky="w")
txt_Email = Entry(self.Manage_Frame, textvariable=self.email_var, font=("times new roman", 15, "bold"), bd=5, relief=GROOVE)
txt_Email.grid(row=3, column=1, pady=10, padx=20, sticky="w")
lbl_gender = Label(self.Manage_Frame, text="Gender", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_gender.grid(row=4, column=0, pady=10, padx=20, sticky="w")
combo_gender = ttk.Combobox(self.Manage_Frame, textvariable=self.gender_var, font=("times new roman", 13, "bold"), state="readonly")
combo_gender['values']=("Male", "Female", "Other")
combo_gender.grid(row=4, column=1, pady=10, padx=20)
lbl_contact = Label(self.Manage_Frame, text="Contact", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_contact.grid(row=5, column=0, pady=10, padx=20, sticky="w")
txt_contact = Entry(self.Manage_Frame, textvariable=self.contact_var, font=("times new roman", 15, "bold"), bd=5, relief=GROOVE)
txt_contact.grid(row=5, column=1, pady=10, padx=20, sticky="w")
lbl_dob = Label(self.Manage_Frame, text="D.O.B", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_dob.grid(row=6, column=0, pady=10, padx=20, sticky="w")
txt_dob = Entry(self.Manage_Frame, textvariable=self.dob_var, font=("times new roman", 15, "bold"), bd=5, relief=GROOVE)
txt_dob.grid(row=6, column=1, pady=10, padx=20, sticky="w")
lbl_address = Label(self.Manage_Frame, text="Address", font=("times new roman", 20, "bold"), bg=color, fg="white")
lbl_address.grid(row=7, column=0, pady=10, padx=20, sticky="w")
self.txt_address = Text(self.Manage_Frame, font=("", 10, "bold"), height=4, width=30)
self.txt_address.grid(row=7, column=1, pady=10, padx=20, sticky="w")
#=================BUTTON FRAME
btn_Frame = Frame(self.Manage_Frame, bd=4, relief=RIDGE, bg=color)
btn_Frame.place(x=18,y=540,width=420)
add_btn = Button(btn_Frame, text="ADD", width=10).grid(row=0, column=0, padx=10, pady=5)
update_btn = Button(btn_Frame, text="UPDATE", width=10).grid(row=0, column=1, padx=10, pady=5)
delete_btn = Button(btn_Frame, text="DELETE", width=10).grid(row=0, column=2, padx=10, pady=5)
clear_btn = Button(btn_Frame, text="CLEAR", width=10).grid(row=0, column=3, padx=10, pady=5)
#==================ON OFF BUTTON FRAME
on_off_btn_Frame = Frame(self.root, bd=4, relief=RIDGE, bg='red')
on_off_btn_Frame.place(x=1305,y=100,width=55, height=70)
on_btn = Button(on_off_btn_Frame, text='ON', command=self.on_all).pack(fill=X, side=TOP)
off_btn = Button(on_off_btn_Frame, text='OFF', command=self.off_all).pack(fill=X, side=BOTTOM)
#=================TABLE FRAME
Table_Frame = Frame(self.root, bd=4, relief=RIDGE, bg="crimson")
Table_Frame.place(x=500,y=110, width=760, height=500)
scrollx = Scrollbar(Table_Frame, orient=HORIZONTAL)
scrolly = Scrollbar(Table_Frame, orient=VERTICAL)
self.Student_table = ttk.Treeview(Table_Frame, columns=("Roll", "Name", "Email", "Gender", "Contact", "dob", "Address"), xscrollcommand=scrollx.set, yscrollcommand=scrolly.set)
scrollx.pack(side=BOTTOM, fill=X)
scrolly.pack(side=RIGHT, fill=Y)
scrollx.config(command=self.Student_table.xview)
scrolly.config(command=self.Student_table.yview)
self.Student_table.heading("Roll", text="Roll No.")
self.Student_table.heading("Name", text="Name")
self.Student_table.heading("Email", text="Email")
self.Student_table.heading("Gender", text="Gender")
self.Student_table.heading("Contact", text="Contact")
self.Student_table.heading("dob", text="D.O.B")
self.Student_table.heading("Address", text="Address")
self.Student_table['show']='headings'
self.Student_table.column("Roll", width=100)
self.Student_table.column("Name", width=100)
self.Student_table.column("Email", width=100)
self.Student_table.column("Gender", width=100)
self.Student_table.column("Contact", width=100)
self.Student_table.column("dob", width=100)
self.Student_table.column("Address", width=150)
self.Student_table.pack(fill=BOTH, expand=1)
def on_all(self):
for child in self.Manage_Frame.winfo_children():
child.configure(state='normal')
def off_all(self):
for child in self.Manage_Frame.winfo_children():
child.configure(state='disabled')
root = Tk()
st = Students(root)
root.mainloop()
In this part I'm getting the error.
def on_all(self):
for child in self.Detail_Frame.winfo_children():
child.configure(state='normal')
def off_all(self):
for child in self.Detail_Frame.winfo_children():
child.configure(state='disabled')
Error:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Manish Gusain\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:/Users/Manish Gusain/PycharmProjects/Student_Management_System.py", line 233, in off_all
child.configure(state='disabled')
File "C:\Users\Manish Gusain\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1485, in configure
return self._configure('configure', cnf, kw)
File "C:\Users\Manish Gusain\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1476, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: unknown option "-state"
What I'm trying to do is when I click the Off button all the widgets in the frame should be disabled & when I click On button all the widgets in the frame should be enabled again. But when I click the Off button or On Button it shows this error.
Secondly, how to hide everything except the heading in the tkinter main window when hide button is clicked and show everything again when show button is clicked.
Upvotes: 5
Views: 3860
Reputation: 11342
Concerning your two issues:
The Frame object has no state
attribute so you can check if the widget is a frame and skip the update. You can also use a try\except block to catch errors. The below code does both.
To hide the main frame, just move it off screen so it's not visible on the form
Here is the updated code. You will need to add self
to the Table_Frame
references so it is accessible in the on\off methods.
self.Table_Frame = Frame(self.root, bd=4, relief=RIDGE, bg="crimson") # chnge to self.Table_Frame
self.Table_Frame.place(x=500,y=110, width=760, height=500)
scrollx = Scrollbar(self.Table_Frame, orient=HORIZONTAL)
scrolly = Scrollbar(self.Table_Frame, orient=VERTICAL)
self.Student_table = ttk.Treeview(self.Table_Frame, columns=("Roll", "Name", "Email", "Gender", "Contact", "dob", "Address"), xscrollcommand=scrollx.set, yscrollcommand=scrolly.set)
.............
def on_all(self):
self.Table_Frame.place(x=500,y=110, width=760, height=500) # on screen
for child in self.Manage_Frame.winfo_children():
try:
if child.widgetName != 'frame': # frame has no state, so skip
child.configure(state='normal')
except Exception as e:
print(e)
def off_all(self):
self.Table_Frame.place(x=5000,y=110, width=760, height=500) # off screen
for child in self.Manage_Frame.winfo_children():
try:
if child.widgetName != 'frame': # frame has no state, so skip
child.configure(state='disabled')
except Exception as e:
print(e)
Output (On)
Output (Off)
Upvotes: 4