[TKinter] Accès aux lignes (items) de menu
Le
Pierre Maurette
Bonjour,
Je ne trouve pas d'autre façon d'accéder aux lignes de menu que par
l'intermédiaire d'un indice:
menu.menutop['file'].entryconfig(2, label='Niou')
Je m'explique un peu mieux. Je fais des classes pour les situations les
plus classiques d'interface, afin de n'avoir à modifier qu'une
structure de paramètres en cours de développement. Par exemple ici (en
construction ! la structure n'est pas finalisée, loin de là) :
menu_params = [
['file', 'Fichier (inifiles)'
, ['new', 'Nouveau', 0, 'go']
, ['open', 'Ouvrir', 0, 'open_inifile']
, ['save', 'Sauver sous', 0,
'save_inifile']
, ['insert', 'Insère', 0, None]
, ['delete', 'Effacer', 0, None]
, [None]
, ['quit', 'Quitter', 0, 'quit']
]
, ['view', 'Affichage'
, ['test', 'Test', 0, None]
]
, ['help', 'Aide'
, ['help', 'Aide', 0, None]
, [None]
, ['about', 'A propos', 0, None]
]
]
menu.menutop['file'] est ainsi un objet Menu, correspondant au "têtes
de menus", juste en dessous du toplevel. Les objets de ce type sont
values d'un dictionnaire membre de ma classe. Mais pas moyen de gérer
les lignes de menu comme des objets. Ce que je fais et qui fonctionne,
c'est un dictionnaire membre dont les keys sont les 'new', 'open', etc.
et les values les indices. Ainsi, j'écris:
menu.menutop['file'].entryconfig(menu.menuitems['new'],
label='Niou')
Ma question est juste de savoir si quelque chose de plus simple
m'aurait échappé ?
L'autre souci sur lequel je n'ai pas encore passé beaucoup de temps,
c'est que pour attacher une méthode à command, je passe pour l'instant
par un eval:
if menuitem[3]:
command = eval('master.' + menuitem[3])
else:
command = None
Ce n'est pas satisfaisant, hein ?
Bonne journée à tous, et merci pour vos suggestions
--
Pierre Maurette
Je ne trouve pas d'autre façon d'accéder aux lignes de menu que par
l'intermédiaire d'un indice:
menu.menutop['file'].entryconfig(2, label='Niou')
Je m'explique un peu mieux. Je fais des classes pour les situations les
plus classiques d'interface, afin de n'avoir à modifier qu'une
structure de paramètres en cours de développement. Par exemple ici (en
construction ! la structure n'est pas finalisée, loin de là) :
menu_params = [
['file', 'Fichier (inifiles)'
, ['new', 'Nouveau', 0, 'go']
, ['open', 'Ouvrir', 0, 'open_inifile']
, ['save', 'Sauver sous', 0,
'save_inifile']
, ['insert', 'Insère', 0, None]
, ['delete', 'Effacer', 0, None]
, [None]
, ['quit', 'Quitter', 0, 'quit']
]
, ['view', 'Affichage'
, ['test', 'Test', 0, None]
]
, ['help', 'Aide'
, ['help', 'Aide', 0, None]
, [None]
, ['about', 'A propos', 0, None]
]
]
menu.menutop['file'] est ainsi un objet Menu, correspondant au "têtes
de menus", juste en dessous du toplevel. Les objets de ce type sont
values d'un dictionnaire membre de ma classe. Mais pas moyen de gérer
les lignes de menu comme des objets. Ce que je fais et qui fonctionne,
c'est un dictionnaire membre dont les keys sont les 'new', 'open', etc.
et les values les indices. Ainsi, j'écris:
menu.menutop['file'].entryconfig(menu.menuitems['new'],
label='Niou')
Ma question est juste de savoir si quelque chose de plus simple
m'aurait échappé ?
L'autre souci sur lequel je n'ai pas encore passé beaucoup de temps,
c'est que pour attacher une méthode à command, je passe pour l'instant
par un eval:
if menuitem[3]:
command = eval('master.' + menuitem[3])
else:
command = None
Ce n'est pas satisfaisant, hein ?
Bonne journée à tous, et merci pour vos suggestions
--
Pierre Maurette

Poser une question


class MenuItem:
def __init__(self, parentMenu, itemIndex):
self.parentMenu = parentMenu
self.itemIndex = itemIndex
def configure(self, **options):
self.parentMenu.entryconfig(self.itemIndex, **options)
Non?
Si la question était "y-a-t'il une classe *dans Tkinter* qui permet de
représenter les items de menu?", la réponse est non. Il faut donc soit
s'en passer, soit la faire soi-même.
Ben non. Mais pourquoi enregistrer le nom de la méthode au lieu de la
méthode elle-même? Genre:
menu_params = [
['file', 'Fichier (inifiles)',
['new', 'Nouveau...', 0, master.go],
['open', 'Ouvrir...', 0, master.open_inifile],
['save', 'Sauver sous...', 0, master.save_inifile],
['insert', 'Insère...', 0, None],
# etc...
]
]
Question (piège) subsidiaire: pourquoi master.open_inifile et pas
self.open_inifile?
HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
Merci, solution adoptée, une classe interne. J'étais resté bloqué sur
la recherche de l'objet inexistant.
Merci bien. C'est ce que j'ai fait. A ceci près qu'il m'a fallu
déclarer / définir mes listes dans ma classe principale RepFTPApp(Tk)
en dessous des méthodes, et non plus en tête de fichier. Sans self.,
donc il me semble en variables de classe. Et j'ai nommé dans la liste
les fonctions simplement go, open_inifile et save_inifile. Pas pu faire
autrement sans me faire jeter, doit y avoir plus propre.
Je corrige, j'ai déclaré les listes hors de la classe, en dessous de la
classe, en nommant logiquement les fonctions RepFTPApp.go, etc. C'est
clair et logique, je ne sais pas si on peut passer outre les références
forward en python ?
Au départ j'avais un fichier repftp.py, appli en ligne de commandes,
repftptk.py, cloquodromage du précédent, et petrustkwidgets.py,
quelques widgets de base, dont la classe SimpleMenu(Menu). Le __init__
de cette classe reçoit master (que j'ai depuis renommé en parent). La
liaison de la fonction aux éléments de menu et donc l'eval se
produisant dans cet __init__, ...
--
Pierre Maurette