Je demanderais pourquoi ce code fonctionne mais si je substitue p> avec p> Cela devrait être la bonne façon, cela ne fonctionne pas. p> Il retourne p> Toute suggestion? P> Cordialement p> Mise à jour forte> p> Après @Bryan Oakley Note, je voudrais ajouter des considérations. p> 0) i J'ai compris que kwargs n'accepte que la clé de clé de la clé qui sont: p> classe tkinter.tk (scénographier = aucun, brefName = Aucune, Nom de classe = 'TK', USETK = 1) P> import tkinter as tk
class App(tk.Tk):
def __init__(self, *args, **kwargs):
print("my __init__ args {}".format(args))
print("my __init__ kwargs {}".format(kwargs))
try:
super().__init__(*args, **kwargs)
except:
args = ()
super().__init__(*args, **kwargs)
print("my super args {}".format(args))
print("my super kwargs {}".format(kwargs))
self.title("Hello World")
self.geometry("400x300")
if __name__ == '__main__':
args = ('x','y','z')
kwargs = {'baseName':'foo','className':'bar'}
app = App(*args,**kwargs)
5 Réponses :
super () .__ init __ () code> initialise la superclasse de
app, code> qui est
tk.tk code>. Lorsque vous appelez
app (* args, ** kwargs) code>, vous passez les paramètres nommés
kwargs code> à
tk.tk () code> via
via
Super () .__ init __ (* args, ** kwargs) code>. Au moins un des paramètres (
'passw' code>) n'est pas reconnu par
tk.tk () code>. En réalité, aucun d'entre eux n'est reconnu, mais le premier non reconnu provoque l'accident du programme. P>
Merci pour votre relecture, alors je devrais utiliser Super () .__ init __ () pour passer un nombre arbitraire d'arguments et / ou des arguments de mots clés, je veux dire que c'est correct.
La version de votre code avec Ce n'est pas clair pour moi ce que vous attendez ces arguments à faire, exactement. Ce ne sont pas des choses que super () .__ init __ (* args, ** kwargs) code> ne fonctionne pas parce que votre classe mère (
tkinter.tk code>) 't Supporte les arguments que vous êtes passés. P>
tkinter code> se soucie généralement d'environ, il n'y a donc pas besoin de les transmettre. S'ils sont des choses que votre classe se soucie, vous voulez probablement les nommer explicitement comme des arguments, plutôt que d'utiliser
* args code> et
** kwargs code>. P>.
Je passerais un nombre arbitraire d'arguments arguments arguments tels que ma classe personnelle pour gérer mes projets. Voici un exemple où j'utilise cette technique, Github.com/1966BC/biovarase
@ 1966BC: Vous pouvez le définir et les utiliser dans votre sous-classe` __ init __ () code>, mais vous n'avez pas besoin de les transmettre à
super () .__ init __ () code>.
Ensuite, il est totalement inutile de cette syntaxe. Je ferai et je le ferai en fait, ce que vous avez dit. J'ai lu ceci dans "Python Gui programmation avec Tkinter" Un livre d'Alan Moore.
Considérez ce code:
Tk(server="127.0.0.1", user="guest", passw="12345", database="genbank")
Je reviendrai cette discussion car j'aurais trouvé un moyen de faire ce que je voulais, nommément passer un certain nombre d'arguments arbitraires ou de kwargs à une classe lorsque nous lançons un script Tkinter.
Regardez ce script, la classe de classe App hériter de TK mais recevez une liste, des arguments et une dict, kwargs, lors de son lancement P>
args = ('y', 'y', 'z') p>
kwargs = {'passw': '12345', "utilisateur": "invité", "serveur": "127.0.0.1", "Base de données": "Genbank '} P>
app = application (* args, ** kwargs) p>
app.mainloop () p> blockQuote>
xxx pré> p>
Comme vous pouvez le voir à partir de la définition de la fonction sur HTTPS: // docs.python.org/3/library/tkinter.html#tkinter.tk ,
i Suggérez P> classe tkinter.tk (scénographique = aucun, brefName = Aucune, Nom de classe = 'TK', USETK = 1) code>, il ne supporte aucun des kwargs que vous y passez.
import tkinter as tk
class App(tk.Tk):
def __init__(self, *args, **kwargs):
# Pop and store your kwargs into variables of the class
# Make sure to pop out all your defined keys in kwargs as below
self._server = kwargs.pop('server')
self._user = kwargs.pop('user')
self._password = kwargs.pop('passw')
self._database = kwargs.pop('genbank')
# And pass the args and kwargs
super().__init__(*args, **kwargs)
self.title("Hello World")
self.geometry("400x300")
if __name__ == '__main__':
args = ('Y','Y','Z')
kwargs = {'server':"127.0.0.1",'user':"guest",'passw':"12345",'database':"genbank"}
app = App(*args,**kwargs)