Comment puis-je faire une interface graphique en utilisant le modèle/vue/contrôleur de méthode?
J'ai besoin de comprendre le concept derrière le modèle/vue/contrôleur de méthode et la façon d'écrire une interface graphique de cette façon. Ici est vraiment une base, interface utilisateur graphique simple. Quelqu'un peut m'expliquer comment réécrire ce code en utilisant MVC?
from tkinter import *
class Application(Frame):
""" GUI application that creates a story based on user input. """
def __init__(self, master):
""" Initialize Frame. """
super(Application, self).__init__(master)
self.grid()
self.create_widgets()
def create_widgets(self):
""" Create widgets to get story information and to display story. """
# create instruction label
Label(self,
text = "Enter information for a new story"
).grid(row = 0, column = 0, columnspan = 2, sticky = W)
# create a label and text entry for the name of a person
Label(self,
text = "Person: "
).grid(row = 1, column = 0, sticky = W)
self.person_ent = Entry(self)
self.person_ent.grid(row = 1, column = 1, sticky = W)
# create a label and text entry for a plural noun
Label(self,
text = "Plural Noun:"
).grid(row = 2, column = 0, sticky = W)
self.noun_ent = Entry(self)
self.noun_ent.grid(row = 2, column = 1, sticky = W)
# create a label and text entry for a verb
Label(self,
text = "Verb:"
).grid(row = 3, column = 0, sticky = W)
self.verb_ent = Entry(self)
self.verb_ent.grid(row = 3, column = 1, sticky = W)
# create a label for adjectives check buttons
Label(self,
text = "Adjective(s):"
).grid(row = 4, column = 0, sticky = W)
# create itchy check button
self.is_itchy = BooleanVar()
Checkbutton(self,
text = "itchy",
variable = self.is_itchy
).grid(row = 4, column = 1, sticky = W)
# create joyous check button
self.is_joyous = BooleanVar()
Checkbutton(self,
text = "joyous",
variable = self.is_joyous
).grid(row = 4, column = 2, sticky = W)
# create electric check button
self.is_electric = BooleanVar()
Checkbutton(self,
text = "electric",
variable = self.is_electric
).grid(row = 4, column = 3, sticky = W)
# create a label for body parts radio buttons
Label(self,
text = "Body Part:"
).grid(row = 5, column = 0, sticky = W)
# create variable for single, body part
self.body_part = StringVar()
self.body_part.set(None)
# create body part radio buttons
body_parts = ["bellybutton", "big toe", "medulla oblongata"]
column = 1
for part in body_parts:
Radiobutton(self,
text = part,
variable = self.body_part,
value = part
).grid(row = 5, column = column, sticky = W)
column += 1
# create a submit button
Button(self,
text = "Click for story",
command = self.tell_story
).grid(row = 6, column = 0, sticky = W)
self.story_txt = Text(self, width = 75, height = 10, wrap = WORD)
self.story_txt.grid(row = 7, column = 0, columnspan = 4)
def tell_story(self):
""" Fill text box with new story based on user input. """
# get values from the GUI
person = self.person_ent.get()
noun = self.noun_ent.get()
verb = self.verb_ent.get()
adjectives = ""
if self.is_itchy.get():
adjectives += "itchy, "
if self.is_joyous.get():
adjectives += "joyous, "
if self.is_electric.get():
adjectives += "electric, "
body_part = self.body_part.get()
# create the story
story = "The famous explorer "
story += person
story += " had nearly given up a life-long quest to find The Lost City of "
story += noun.title()
story += " when one day, the "
story += noun
story += " found "
story += person + ". "
story += "A strong, "
story += adjectives
story += "peculiar feeling overwhelmed the explorer. "
story += "After all this time, the quest was finally over. A tear came to "
story += person + "'s "
story += body_part + ". "
story += "And then, the "
story += noun
story += " promptly devoured "
story += person + ". "
story += "The moral of the story? Be careful what you "
story += verb
story += " for."
# display the story
self.story_txt.delete(0.0, END)
self.story_txt.insert(0.0, story)
# main
def main():
root = Tk()
root.title("Mad Lib")
app = Application(root)
root.mainloop()
main()
Votre code ne contient que la "vue". Il n'a pas de modèles ni les contrôleurs.
OK, eh bien, comment puis-je ajouter? Que dois-je faire?
Vous avez besoin d'un peu plus sophistiqué exemple, où vous avez réellement des objets ou des données de modèle, avant un MVC design pour votre exemple aucun sens ou expliquer quelque chose pour vous.
J'ai changé le code pour quelque chose de plus. Hoefully, c'est mieux.
OK, eh bien, comment puis-je ajouter? Que dois-je faire?
Vous avez besoin d'un peu plus sophistiqué exemple, où vous avez réellement des objets ou des données de modèle, avant un MVC design pour votre exemple aucun sens ou expliquer quelque chose pour vous.
J'ai changé le code pour quelque chose de plus. Hoefully, c'est mieux.
OriginalL'auteur Ivan Lesiv | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
ToyMVC "Jouet MVC (Modèle-Vue-Contrôleur) design" dans le Tkinter docs est probablement ce que vous cherchez. Personnellement, je ne concevoir les choses un peu différemment, mais il a surtout du sens.
La clé est de séparer le modèle et la vue et le contrôleur est alors tous les bits de connecter jusqu'à un modèle et une vue.
Donc, au lieu d'avoir un
Application
de tout cela, vous avez de ces classes:StoryModel
: Un modèle d'une histoire.StoryView
: Une fenêtre ou d'un autre widget que vous vous en tenez à l'intérieur du cadre—bien que dans les Savoirs traditionnels, vous pouvez facilement en faire le cadre en lui-même.StoryController
: Une classe qui, étant donné unStoryModel
et unStoryView
, dira sonStoryView
de créer des widgets pour afficher cette histoire, et ensuite surveiller à la fois de Modèle et de Vue pour changé et les transmettre de l'un à l'autre.Étant donné que, vous pouvez créer un simple
Application
qui crée unStoryModel
, unStoryView
, une image de la fenêtre pour mettre la Vue, et unStoryController
de connecter jusqu'le modèle et la vue.Par exemple,
StoryModel
pourrait ressembler à ceci:Et puis vous pouvez obtenir la fantaisie et de créer un
AlternateStoryView
qui affiche la même information d'une manière différente, et changer leApplication
pour en créer un de chaque point de vue, et un contrôleur pour chaque, sur le même modèle. Par exemple, vous pouvez créer une vue qui n'avaient pas l'utilisation d'une grille, et au lieu automatiquement mis les choses:Si vous connaissez la
trace
méthode, vous pouvez remarquer qu'uneObservable
n'est pas vraiment différent que d'utiliserTkinter.StringVar
, etc. Mais l'avantage (en plus de ne pas avoir le maladroit syntaxe detrace
...) c'est qu'il n'y a rienTkinter
spécifiques sur le modèle de cette façon.Ainsi, vous pouvez créer un
GtkStoryView
ou unCursesStoryView
, sans modifier le code de laModel
etController
. (Ce n'est pas tout à fait travailler avec ToyMVC, parce que des choses commeaddButton.config(command=self.addMoney)
de ne pas traduire exactement à Gtk+ ou des malédictions, sauf si vous avez construit une grande Savoirs traditionnels couche d'émulation... mais vous n'avez pas à faire cette erreur dans votre conception.)Aussi, notez que l'utilisation de
Observable
wrappers autour de l'ensemble de vos variables du modèle n'est certainement pas la seule façon de raccorder un contrôleur, ou même nécessairement le plus Pythonic.Ce qui est
ObservableStr
etObservableBool
? D'où viennent-ils (le code n'a pas d'importations, et elles ne sont certainement pas danstkinter
)? Cela ressemble à quelque chose de mettre en œuvre un modèle important pour les Savoirs traditionnels-à-Modèle de synchronisation pourtant, je ne peux pas le trouver n'importe où.OriginalL'auteur abarnert
Si vous souhaitez démarrer/apprendre le développement web MVC en utilisant langage python je suggère de commencer avec Framework Django
OriginalL'auteur Ari