0
votes

tkinter, passant * args * kwargs sur super () .__ init__

Je demanderais pourquoi ce code fonctionne xxx pré>

mais si je substitue p> xxx pré>

avec p> xxx

Cela devrait être la bonne façon, cela ne fonctionne pas. p>

Il retourne p> xxx pré>

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)


0 commentaires

5 Réponses :


0
votes

super () .__ init __ () initialise la superclasse de app, qui est tk.tk . Lorsque vous appelez app (* args, ** kwargs) , vous passez les paramètres nommés kwargs à tk.tk () via via Super () .__ init __ (* args, ** kwargs) . Au moins un des paramètres ( 'passw' ) n'est pas reconnu par tk.tk () . En réalité, aucun d'entre eux n'est reconnu, mais le premier non reconnu provoque l'accident du programme.


1 commentaires

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.



1
votes

La version de votre code avec super () .__ init __ (* args, ** kwargs) ne fonctionne pas parce que votre classe mère ( tkinter.tk ) 't Supporte les arguments que vous êtes passés.

Ce n'est pas clair pour moi ce que vous attendez ces arguments à faire, exactement. Ce ne sont pas des choses que tkinter 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 et ** kwargs . .


3 commentaires

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 __ () , mais vous n'avez pas besoin de les transmettre à super () .__ init __ () .


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.



0
votes

Considérez ce code:

Tk(server="127.0.0.1", user="guest", passw="12345", database="genbank")


0 commentaires

0
votes

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

args = ('y', 'y', 'z')

kwargs = {'passw': '12345', "utilisateur": "invité", "serveur": "127.0.0.1", "Base de données": "Genbank '}

app = application (* args, ** kwargs)

app.mainloop () xxx


0 commentaires

0
votes

Comme vous pouvez le voir à partir de la définition de la fonction sur HTTPS: // docs.python.org/3/library/tkinter.html#tkinter.tk , 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.

i Suggérez P>

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)


0 commentaires