2011-01-25 9 views
2

J'utilise tkinter, mais ma question est probablement générale.gui conception question

C'est la première fois que je conçois une interface graphique. Chacun de mes objets est modélisé en tant que classe. Je ne comprends pas comment lier la hiérarchie des classes de l'interface graphique avec le reste de la hiérarchie des classes.

Par exemple, j'ai créatures:

# this is before I had any GUI in my code 
class Creature: 
    def current_position() # returns real-time x, y coords 
    # ... 

Je veux les afficher sous forme de cercles qui se déplacent autour sur une toile. Il m'a semblé raisonnable que la représentation graphique du mouvement devrait être fournie par une méthode update_display dans class Creature. Cependant, cela signifie que class Creature doit connaître les détails de l'interface graphique. En outre, le class App(tkinter.Tk) avec une méthode redraw aurait besoin de connaître la liste de toutes les instances existantes Creature afin d'appeler leurs méthodes update_display. C'est beaucoup trop de dépendance.

Quelle est la bonne approche?

Répondre

4

Le modèle généralement accepté pour cela est appelé modèle/vue/contrôleur. Vous avez un objet contrôleur qui connaît toutes les créatures (votre "modèle") et l'interface graphique (votre "vue"). Le contrôleur est alors responsable de la connexion des deux. Par exemple, votre vue pourrait avoir une méthode "draw_creature" qui accepte une créature comme entrée. Le contrôleur va alors parcourir les créatures, passant ensuite une par une à la vue. Ou, chaque créature a une méthode "dessiner" qui accepte une vue en tant que paramètre, et la vue demande à chaque créature de se dessiner, en lui passant une référence à la vue.

Avec ce modèle en place, vous pouvez facilement avoir plusieurs vues, mais les créatures n'ont pas besoin d'être mises à jour pour les connaître. De même, vous pouvez changer la façon dont vous stockez et gérez les créatures et la vue n'a pas besoin de savoir quoi que ce soit à ce sujet.

+0

Merci. Y at-il une référence que je devrais aller en lire plus à ce sujet? (Ou est-ce aussi simple que cela semble?) – max

+0

Avec une approche, il semblerait que les créatures auraient besoin de savoir si j'utilise tk ou un autre cadre GUI - sinon comment peuvent-ils se dessiner même après avoir passé une vue comme une référence? Avec l'autre approche, l'interface graphique devrait en savoir beaucoup sur les créatures si elle peut les dessiner juste en fonction de la référence de la créature. C'est toujours mieux que ce à quoi je me suis battu à l'origine - mais cela ne supprime pas complètement la dépendance entre l'interface graphique et le modèle. Ou ai-je mal compris quelque chose? – max

+0

@max - vous avez raison. Le montant du découplage est un facteur du temps que vous voulez investir. En règle générale, votre modèle doit être indépendant de la vue. La vue, cependant, doit être au courant des objets avec lesquels il doit travailler. Vous ne pouvez pas créer une vue et l'avoir pour tous les modèles possibles. La vue a besoin d'un couplage lâche avec vos créatures. Par exemple, il peut savoir appeler «get_position» ou «get_name», etc. L'abstraction signifie simplement qu'il ne doit pas savoir comment sont créés, stockés, etc. –