Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[TKinter] Accès aux lignes (items) de menu

2 réponses
Avatar
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

2 réponses

Avatar
Eric Brunel
On Fri, 06 Apr 2007 12:30:39 +0200, Pierre Maurette
wrote:

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é ?


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.

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 ?


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+-'])"

Avatar
Pierre Maurette
On Fri, 06 Apr 2007 12:30:39 +0200, Pierre Maurette
wrote:

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é ?


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.


Merci, solution adoptée, une classe interne. J'étais resté bloqué sur
la recherche de l'objet inexistant.


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 ?


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...
]
]


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 ?

Question (piège) subsidiaire: pourquoi master.open_inifile et pas
self.open_inifile?


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