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> 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
3 Réponses :
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. ...
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 Modifiez ceci: P> super () code> et doivent hériter de la trame.
class CustomFrame(anotherobject):
def __init__(self,**args):
super().__init__()
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 code>, 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 () code> comme moyen de passer un autre objet en tant que conteneur. Donc, dites code> PersonnelFrame code> hérités de
AutresObject code> et que vous voulez faire
étiquette (Customeframe) code> résultant en gros
étiquette (autreObject) code> . 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.
vous pourriez-vous EM> probablement réaliser ce que vous voulez si vous créez votre propre sous-classe personnalisée de ( 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> tk.label code> qui fait fondamentalement le déballage pour vous.
@property
def interior(self):
return self.externalobject.interior
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 code> 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 __ () code> sous votre
__ init __ code> et vous devez hériter de la trame.
Qu'en est-il de cela:
label1 = étiquette (CFR1.ExternalObject) code>? Est-ce ce que vous essayez d'accomplir?
Oui, avec
Label1 = étiquette (CCR1.ExternalObject.Interior) code> fonctionne.
Mais c'est ce que je veux éviter.
Ahhhh ok. Pouvez-vous me dire ce que
intérieur code> 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 code> intérieure code> sans faire
cfr1.externalObject.Interior code>. 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 __ code>, 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.