My Tkinter program was running perfectly, but all of a sudden, it started showing me the following error whenever I ran it:
File “C:\Users\allen\AppData\Local\Programs\Python\Python311\Lib\tkinter\ttk.py”, line 281, in _val_or_dict
res = tk.call(\*(args + options))
^^^^^^^^^^^^^^^^^^^^^^^^^^
_tkinter.TclError: wrong # args: should be “.!treeview heading column -option value…”
[Done] exited with code=1 in 3.961 seconds
See the Code below:
import tkinter as tk
from tkinter import ttk, messagebox
import ttkbootstrap as tb
import data_layer
class formMain:
def \__init_\_(self):
self.data_manager = data_layer.DataLayer()
self.build_control()
self.refresh_tree()
self.form_main.mainloop()
def refresh_tree(self):
self.tree.delete(\*self.tree.get_children())
#for record in \[\["Benjamin Allen", "20061021012", "Girei","Senior Prog Analyst","13/7","Male","30/10/1985","30/11/2006","25/11/2024","M.Sc Computer Science"\], \["Mohammed Bello", "20111021012", "Yola South","Senior Prog Analyst","13/7","Male","15/11/1986","30/11/2006","25/11/2024","M.Sc Computer Science"\], \["Pallavi Vadia", "20061021012", "Numan","Senior Prog Analyst","13/7","Male","30/10/1985","30/11/2006","25/11/2024","M.Sc Computer Science"\]\]:
for record in self.data_manager.get_data():
self.tree.insert("", tk.END, values=record)
def delete_click(self):
self.delete_record()
self.refresh_tree()
def edit_click(self):
print("edit")
self.refresh_tree()
def save_click(self):
self.save_record()
self.refresh_tree()
def get_data_from_controls(self):
return \[self.entry_name.get(),
self.entry_psn.get(),
self.entry_lga.get(),
self.entry_designation.get(),
self.entry_gl.get(),
self.radio_gender.get(),
self.entry_dob.get(),
self.entry_date_of_first_app.get(),
self.entry_date_of_pre_app.get(),
self.entry_qualification.get(),
self.entry_remarks.get()\]
def save_record(self):
self.data_manager.add_record(self.get_data_from_controls())
def delete_record(self):
selection = self.tree.focus()
if not selection:
messagebox.showerror(message="No Record Selected. Please Select and try again")
return
row_index = self.tree.index(selection)
self.data_manager.delete_record(row_index+1)
def theme_selected(self, event):
self.style.theme_use(self.combo_theme.get())
def update_controls(self, parent):
for child in self.walk_widgets(parent):
if isinstance(child,(tk.Frame, ttk.Treeview)):
child.grid_configure(padx=15, pady=15, sticky="w")
else:
child.grid_configure(padx=5, pady=5, sticky="w")
def walk_widgets(self, parent):
widget =\[\]
for child in parent.winfo_children():
widget.append(child)
widget.extend(self.walk_widgets(child))
return widget
def build_control(self):
self.form_main = tb.Window(themename="superhero")
self.style = tb.Style()
self.form_main.title("Adamawa State Bureau of Statistics Staff Manager")
#CREATE CONTROLS
frame_top_left = tk.Frame(self.form_main)
button_edit = tk.Button(frame_top_left, text="Edit", width=10, command=self.edit_click)
button_delete = tk.Button(frame_top_left, text="Delete", width=10, command=self.delete_click)
#THEMES
themes = \["cosmo","flatly","sandstone","pulse","united","journal","darkly","superhero"\]
frame_top_right = tk.Frame(self.form_main)
self.combo_theme = ttk.Combobox(frame_top_right, values=themes)
self.combo_theme.set(self.style.theme.name)
self.combo_theme.bind("<<ComboboxSelected>>",self.theme_selected)
#column_ids = \["Full Name","PSN", "LGA","Designation","GL","Gender","DOB","Date of 1st App","Date of Pre App","Qualification"\]
column_ids = self.data_manager.get_header()
self.tree = ttk.Treeview(self.form_main,columns=column_ids,show="headings")
for id in column_ids:
self.tree.heading(column = id, text = id, anchor = "e")
#DATA CONTROLS
frame_centre_left = tk.Frame(self.form_main,relief="solid",borderwidth=1)
self.label_name = tk.Label(frame_centre_left,text="Name")
self.entry_name = tk.Entry(frame_centre_left)
self.label_psn = tk.Label(frame_centre_left,text="PSN")
self.entry_psn = tk.Entry(frame_centre_left)
self.label_lga = tk.Label(frame_centre_left,text="LGA")
self.entry_lga = tk.Entry(frame_centre_left)
self.label_designation = tk.Label(frame_centre_left,text="Designation")
self.entry_designation = tk.Entry(frame_centre_left)
self.label_gl = tk.Label(frame_centre_left,text="GL")
self.entry_gl = tk.Entry(frame_centre_left)
self.radio_gender = tk.StringVar(value="Male")
radio_male = tk.Radiobutton(frame_centre_left,text="Male",value="Male",variable=self.radio_gender)
radio_female = tk.Radiobutton(frame_centre_left,text="Female",value="Female",variable=self.radio_gender)
self.label_dob = tk.Label(frame_centre_left,text="DOB")
self.entry_dob = tk.Entry(frame_centre_left)
self.label_date_of_first_app = tk.Label(frame_centre_left,text="Date of First App")
self.entry_date_of_first_app = tk.Entry(frame_centre_left)
self.label_date_of_pre_app = tk.Label(frame_centre_left,text="Date of Pre App")
self.entry_date_of_pre_app = tk.Entry(frame_centre_left)
self.label_qualification = tk.Label(frame_centre_left,text="Qualification")
self.entry_qualification = tk.Entry(frame_centre_left)
self.label_remarks = tk.Label(frame_centre_left,text="Remarks")
self.entry_remarks = tk.Entry(frame_centre_left)
self.button_add = tb.Button(frame_centre_left,text="Add",command=self.save_click,width=10,bootstyle="light")
#POSITION CONTROLS
frame_top_left.grid(row=1, column=1)
button_edit.grid(row=1, column=1)
button_delete.grid(row=1, column=2)
self.combo_theme.grid(row=1, column=1)
self.tree.grid(row=2, column=2)
frame_centre_left.grid(row=2,column=1)
self.label_name.grid(row=2,column=1)
self.entry_name.grid(row=2,column=2)
self.label_psn.grid(row=3,column=1)
self.entry_psn.grid(row=3,column=2)
self.label_lga.grid(row=4,column=1)
self.entry_lga.grid(row=4,column=2)
self.label_designation.grid(row=5,column=1)
self.entry_designation.grid(row=5,column=2)
self.label_gl.grid(row=6,column=1)
self.entry_gl.grid(row=6,column=2)
self.radio_gender = tk.StringVar(value="Male")
radio_male.grid(row=7,column=1)
radio_female.grid(row=7,column=2)
self.label_dob.grid(row=8,column=1)
self.entry_dob.grid(row=8,column=2)
self.label_date_of_first_app.grid(row=9,column=1)
self.entry_date_of_first_app.grid(row=9,column=2)
self.label_date_of_pre_app.grid(row=10,column=1)
self.entry_date_of_pre_app.grid(row=10,column=2)
self.label_qualification.grid(row=11,column=1)
self.entry_qualification.grid(row=11,column=2)
self.label_remarks.grid(row=12,column=1)
self.entry_remarks.grid(row=12,column=2)
self.button_add.grid(row=13, column=1)
self.update_controls(self.form_main)
frame_top_right.grid(row=1, column=2, sticky="w")
form = formMain()
