environnement: Ubuntu 18.04.5 LTS (Windows Subsystem for Linux) Python 3.8.0 VcXsrv 1.20.5.1
Si vous cochez le bouton de vérification (bouton Vérifier) dans Tkinter de Python, le champ de saisie (Entrée) sera activé et vous pouvez entrer. Si elle n'est pas cochée, vous ne pourrez pas modifier.
import tkinter as tk
def change_state():
if bool_check.get():
#Une fois coché
entry.config(state='normal')
else:
#Lorsqu'elle n'est pas cochée
entry.config(state='disabled')
root = tk.Tk()
entry = tk.Entry()
entry.config(state='disabled') #Initialement invalide
bool_check = tk.BooleanVar()
bool_check.set(False) #Pas de contrôle au début
check = tk.Checkbutton(variable=bool_check, command=change_state)
check.pack()
entry.pack()
root.mainloop()
Définissez la fonction change_state.
Le nom de la variable peut être n'importe quoi, mais par exemple, assignez tk.BooleanVar () à la variable bool_check. Créez une case à cocher en passant la variable bool_check à l'argument variable de tk.Checkbutton () et la fonction change_state à l'argument de commande.
La présence ou l'absence du contrôle est renvoyée sous forme de valeur booléenne par bool_check.get (). Si elle n'est pas cochée, change_state () sera appelé.
Dans change_state (), l'état de l'entrée créée est modifié selon qu'elle est cochée ou non.
Si vous pouvez passer bool_check ou entry comme argument à change_state (), il semble que vous puissiez faire la même chose avec deux champs d'entrée ou plus. Cependant, par exemple
def change_state(bool_check, entry):
if bool_check.get():
entry.config(state='normal')
else:
entry.config(state='disabled')
Définissez la fonction change_state avec un argument comme
tk.Checkbutton(command=change_state(bool_check, entry))
Même si vous passez une fonction avec un argument à l'argument de commande de tk.Checkbutton () like, cela ne fonctionne pas correctement. Pour fonctionner correctement, passez une expression lambda à command. C'est,
import tkinter as tk
def change_state(bool_check, entry):
if bool_check.get():
entry.config(state='normal')
else:
entry.config(state='disabled')
root = tk.Tk()
#Le premier
entry1 = tk.Entry()
entry1.config(state='disabled')
bool_check1 = tk.BooleanVar()
bool_check1.set(False)
check1 = tk.Checkbutton(text='1', variable=bool_check1,
command=lambda: change_state(bool_check1, entry1))
check1.pack()
entry1.pack()
#Seconde
entry2 = tk.Entry()
entry2.config(state='disabled')
bool_check2 = tk.BooleanVar()
bool_check2.set(False)
check2 = tk.Checkbutton(text='2', variable=bool_check2,
command=lambda: change_state(bool_check2, entry2))
check2.pack()
entry2.pack()
root.mainloop()
Je pense que cette façon d'écrire est meilleure car la fonction change_state ne dépend pas de variables globales.
Si elle n'est pas cochée, la chaîne de caractères saisie sera supprimée et «invalide» sera affiché.
import tkinter as tk
def change_state():
if bool_check.get():
#Une fois coché
entry.config(state='normal')
entry.delete(0, tk.END) #Après l'avoir rendu normal"Invalide"Effacer
else:
#Lorsqu'elle n'est pas cochée
entry.delete(0, tk.END) #Supprimer la chaîne de caractères du 0e caractère à la fin
entry.insert(0, "Invalide") #0e caractère de l'entrée"Invalide"Insérer
entry.config(state='disabled') #insérer puis désactiver
root = tk.Tk()
entry = tk.Entry()
entry.insert(0, "Invalide") #0e caractère de l'entrée"Invalide"Insérer
entry.config(state='disabled') #insérer puis désactiver
bool_check = tk.BooleanVar()
bool_check.set(False)
check = tk.Checkbutton(variable=bool_check, command=change_state)
check.pack()
entry.pack()
root.mainloop()
Il semble que cela puisse être appliqué, comme donner une valeur initiale.
Recommended Posts