0
votes

Méthode principale pour appeler un objet personnalisé dans Python

J'essayais de réparer quelque chose lié à ce qu'un objet retourne lorsque vous utilisez un objet comme argument.

Par exemple, j'ai un objet personnalisé et je souhaite l'utiliser comme parent pour un autre widget Tkinter, donc J'ai besoin de retourner un objet Tkinter pour placer le nouvel objet Tkinter dans mon objet personnalisé, mais mon objet personnalisé renvoie un objet d'une classe personnalisée. P>

Je peux expliquer cela beaucoup mieux sur le code: p> xxx pré>

maintenant je veux utiliser "Self.ExternalObject.Interior" comme le parent pour label1 Mais je veux rendre cela convivial juste appeler "CCR1" au lieu de "auto.externalObject.Interior" p>

Je sais que si j'utilise la méthode forte> et je retourne la valeur que J'ai besoin de fonctionner si je passe "CCR1" en tant que fonction, mais je veux le rendre plus pythonique que possible. P>

Donc, j'ai besoin de savoir s'il y a une autre méthode spéciale ou quelque chose pour modifier ce qu'il Retours. P>

EDIT: Donc, cela fait partie du code que j'utilise: p>

Ceci est le code du cadre défilé vertical (pas mon code). P>

class UtilityPanel(object):
    def __init__(self,parent='*',title='Main Title',state='normal',bg='red'):
        super().__init__()
        if parent != '*':
            self.parent=parent
        else:
            raise TypeError('You must specify a parent for this widget.')
        self.title=title

        global subpanels

        if len(subpanels) == 0:
            self.panelid = 'sp-1'
            subpanels.append('sp-1')
        else:
            self.panelid = 'sp-'+str(int(subpanels[-1].split('-')[1])+1)
            subpanels.append(self.panelid)

        self.panel = VerticalScrolledFrame(self.parent,bg=bg,width=600,height=200,name=self.panelid)

    def __call__(self,name):
        return(self.panel.interior)

    def pack(self):
        self.panel.place(x=300)
        global activepanel
        activepanel = self.panelid


13 commentaires

Je pense qu'il y a une bonne question ici, mais il est difficile de lire, en partie parce que vous avez mis une partie d'elle comme des commentaires dans le code. (Je n'ai pas répondu BTW).


J'ai apporté des modifications pour que cela préférable de lire, je veux simplement expliquer chaque partie du code «inachevé» que je posterai


La seule chose qui peut être le parent d'un widget Tkinter est un autre widget Tkinter. Pour votre objet personnalisé pour remplir ce rôle, il doit être dérivé d'une classe Tkinter - je suppose que cadre dans votre cas.


Oui, c'est tout, j'ai besoin d'un cadre, auto.externalObject.Interior est un cadre, mais je dois le retourner juste appeler CFR1.


Qu'entendez-vous par «j'ai besoin de le renvoyer» ... Je ne suis pas sûr de comprendre votre besoin ici. Cela dit que j'ai remarqué que vous avez manqué super () .__ init __ () sous votre __ init __ et vous devez hériter de la trame.


Qu'en est-il de cela: label1 = étiquette (CFR1.ExternalObject) ? Est-ce ce que vous essayez d'accomplir?


Oui, avec Label1 = étiquette (CCR1.ExternalObject.Interior) fonctionne.


Mais c'est ce que je veux éviter.


Ahhhh ok. Pouvez-vous me dire ce que intérieur est exactement. Est-ce un autre conteneur ou juste une variable tenant une valeur?


J'ai édité la principale question pour montrer comment cela fonctionne.


Je vois que vous utilisez le code de Cet article . Je ne suis pas sûr que s'il existe un moyen de créer un chemin vers le cadre intérieure sans faire cfr1.externalObject.Interior . S'il y a tous les tests que j'ai faits a échoué et je ne suis tout simplement pas au courant de la méthode correcte pour le faire. Bonne chance. J'espère que quelqu'un connaît la solution s'il y en a un. Je suis curieux de voir s'il y a un moyen de faire cela.


Si vous souhaitez utiliser cet objet personnalisé en tant que parent vers un autre widget, pourquoi ne vous hérisez-vous pas d'un widget tel que le cadre? Cela rend ce problème trivial. Tout le reste entraînera un code déroutant que d'autres trouveront difficilement à comprendre.


Juste parce que je souhaite utiliser une propriété d'un objet personnalisé créé par un objet personnalisé. Pas un seul objet personnalisé à la place. Donc, de la même manière, avec __ RECR __ , que c'est la représentation de l'objet lorsque vous le montrerez, et c'est éditable, j'ai besoin d'une méthode similaire, mais lorsque vous appelez l'objet, alors, au lieu de Appelez l'objet et renvoyez le type de l'objet, renvoyez ce que je veux.


3 Réponses :


0
votes

Vous essayez d'implicirement lancer / contrarier un type d'objet à un autre.

Si vous voulez être "Pythonic", rappelez-vous, P>

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
...


0 commentaires

3
votes

Je pense que je comprends la question que l'OP a eu ici. Ils ne peuvent pas utiliser le cadre comme conteneur pour leur étiquette et c'est tout parce qu'ils manquent super () code> et doivent hériter de la trame.

Modifiez ceci: P>

class CustomFrame(anotherobject):
    def __init__(self,**args):
        super().__init__()


6 commentaires

Ok, je pense que je n'ai pas expliqué correctement, mais c'est proche de ce que je veux. J'explique un peu plus, j'ai un objet personnalisé externe qui est un cadre défilé pour Tkinter, et j'ai créé un nouvel objet pour lui donner de nouvelles propriétés et agir comme nouvel objet. Ce cadre défilable personnalisé a l'intérieur d'attributs, ce que j'ai besoin de passer à un widget en tant que parent pour y adapter. Mais j'ai besoin de faire comme n'importe quel widget dans tkinter


Donc, j'ai besoin de retourner cet attribut intérieure du cadre défilable, qui est à l'intérieur de mon nouvel objet personnalisé, passant simplement le nom de l'objet personnalisé ... Désolé, si je ne m'explique toujours pas bien, mais c'est difficile pour moi en raison de la langue.


Ensuite, au lieu de hériter de image , vous pouvez hériter de votre objet client. Cela devrait fonctionner ici.


C'est un peu pas clair ce que tu veux. Il semble presque que vous souhaitiez pouvoir utiliser CustomFrame () comme moyen de passer un autre objet en tant que conteneur. Donc, dites PersonnelFrame hérités de AutresObject et que vous voulez faire étiquette (Customeframe) résultant en gros étiquette (autreObject) . Est-ce exact?


Je sais ce que vous dites, mais ne fonctionne pas parce que je définis le cadre défilé dans l'objet personnalisé, je ne peux donc pas hériter de la propriété d'un objet créé à l'intérieur.


Ok, attendez un moment, je modifierai le message principal avec le code, je pense que cela pourrait donner une idée plus claire de ce que je veux.



0
votes

vous pourriez-vous EM> probablement réaliser ce que vous voulez si vous créez votre propre sous-classe personnalisée de tk.label code> qui fait fondamentalement le déballage pour vous.

( Disclaimer: Je n'ai jamais utilisé Tkinter, je ne peux donc pas dire si cela fonctionne réellement dans le contexte de ce cadre. Cet exemple est simplement de démontrer le concept que j'essaie de décrire ici.) Em> p>

@property
def interior(self):
    return self.externalobject.interior


0 commentaires