-2

I’m coding a database management app with python tkinter packages. This API is on a NAS (network attached storage). So the users can open it from a connection and make modifications in real time. I want to give some privilege for admin users. That means if a users log in the app, they can tick and fill entry box which is disabled for normal users. How to do it?

Here is my try:

from tkinter import *
import tkinter as tk
from tkinter import ttk

#Initialisation

root=Tk()
root.title("Test")


#Tab creation

my_tab=ttk.Notebook(root)
my_tab.pack(expand=True, fill=tk.BOTH)

#Tab name and their creation
frames=[]
nom_des_onglets=["Main", "First tab", "Second tab"]

def admin():
    global longentrie
    win=Toplevel()
    longentrie = StringVar()
    password_msg = tk.Label(win,text="Enter password for administrator privileges")
    password_msg.pack()
    password_entries = tk.Entry(win,textvariable=longentrie)
    password_entries.pack()
    tk.Button(win,text='Enter', command=admin_privilege).pack()


def admin_privilege():
    global login_value
    password_admin = longentrie.get()
    if password_admin == 'good':
        login_value=1
    else:
        login_value=0

for i in range(3):
    frame=ttk.Frame(my_tab) # add tab
    frame.pack(fill="both")
    frames.append(frame)
    my_tab.add(frames[i], text=nom_des_onglets[i])


#Login button
login=tk.Button(frames[0],text="login", command=admin)
login.pack()


#special priviledge
var1 = tk.IntVar()
ts = [tk.StringVar() for _ in range(17)]
lbl7 = tk.Checkbutton(frames[1], text='Text',variable=var1, onvalue=1,offvalue=0, bg='#ececec', state='disabled')
lbl7.grid(row=0, column=0, padx=5, pady=3)
lbl1=tk.Label(frames[1], text="Name")
lbl1.grid(row=2, column=0, padx=5, pady=3)
ent7=Entry(frames[1], textvariable=ts[6])
ent7.grid(row=2, column=1, padx=5, pady=3,sticky="nsew")


lbl8=tk.Label(frames[1], text="Age")
lbl8.grid(row=3, column=0, padx=5, pady=3)
ent8=Entry(frames[1], textvariable=ts[7],state='disabled')
ent8.grid(row=3, column=1, padx=5, pady=3,sticky="nsew")
if login_value == 1:
    lbl7.configure(state='normal')
    ent8.configure(state='normal')

root.mainloop()
Béa
  • 101
  • 2
  • 9
  • What in particular are you having trouble with? You seem to have a password entry thing down and all. – AKX Aug 01 '22 at 12:27
  • But when I enter the correct password, the app don't change the state of entry field and checkbox to normal. I have to restart the app to do this? But it is on NAS so the users who are not admin will have the access to priviledges. I don't want that. – Béa Aug 01 '22 at 12:47
  • Right – maybe move that `if login_value == ...` bit to a function of its own that you also call after you change `login_value`? Either way, remember people can look at the code of the program on the NAS and do whatever they will, so this will not be very strong protection. – AKX Aug 01 '22 at 12:53
  • I also tried this way but it don't give me the right result. It don't change the status after the login. I mean I compile the app then I put it on NAS$ – Béa Aug 01 '22 at 13:06

1 Answers1

1

Here's an example where entering the right password does correctly change the disabled state of those two fields.

This could be refactored to be a lot less messy (better variable naming for one), but it's a start:

import tkinter as tk
from tkinter import ttk

is_admin = False


def setup_ui():
    lbl7.configure(state=("normal" if is_admin else "disabled"))
    ent8.configure(state=("normal" if is_admin else "disabled"))


def do_login_window():
    def admin_privilege():
        global is_admin
        if password_var.get() == "good":
            is_admin = True
            setup_ui()
            login_win.destroy()  # Close the login box

    login_win = tk.Toplevel()
    password_var = tk.StringVar()
    password_msg = tk.Label(login_win, text="Enter password for administrator privileges")
    password_msg.pack()
    password_entries = tk.Entry(login_win, textvariable=password_var)
    password_entries.pack()
    tk.Button(login_win, text="Enter", command=admin_privilege).pack()


# Initialisation

root = tk.Tk()
root.title("Test")

# Tab creation

my_tab = ttk.Notebook(root)
my_tab.pack(expand=True, fill=tk.BOTH)

frames = []

for name in ["Main", "First tab"]:
    frame = ttk.Frame(my_tab)
    frame.pack(fill="both")
    frames.append(frame)
    my_tab.add(frame, text=name)

# Login button
login_frame = frames[0]
login = tk.Button(login_frame, text="login", command=do_login_window)
login.pack()

# special priviledge
data_frame = frames[1]
var1 = tk.IntVar()
ts = [tk.StringVar() for _ in range(17)]
lbl7 = tk.Checkbutton(
    data_frame, text="Text", variable=var1, onvalue=1, offvalue=0, bg="#ececec"
)
lbl7.grid(row=0, column=0, padx=5, pady=3)
lbl1 = tk.Label(data_frame, text="Name")
lbl1.grid(row=2, column=0, padx=5, pady=3)
ent7 = tk.Entry(data_frame, textvariable=ts[6])
ent7.grid(row=2, column=1, padx=5, pady=3, sticky="nsew")

lbl8 = tk.Label(data_frame, text="Age")
lbl8.grid(row=3, column=0, padx=5, pady=3)
ent8 = tk.Entry(data_frame, textvariable=ts[7])
ent8.grid(row=3, column=1, padx=5, pady=3, sticky="nsew")

setup_ui()  # Will be called after logging in too

root.mainloop()
AKX
  • 152,115
  • 15
  • 115
  • 172