IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Positionfrom, comment s'en servir?


Sujet :

Tkinter Python

  1. #1
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut Positionfrom, comment s'en servir?
    Salut tout l'monde,

    Voilà, comme vous vous en doutez, j'ai un problème : j'ai crée un petit soft de generation de noms et à un moment une fenêtre demandant confirmation doit apparaître, j'ai donc créé un Toplevel, dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    def alertposs(self):
    		self.alert=Toplevel()
    		self.alert.title("Confirmation")
    		self.alert.grab_set()
    		self.alert.positionfrom(who=self.fen)#self.fen=Tk()
    		#check des particules
    		if self.part1intvar.get() == 1:
    			p1=self.p1
    		else:
    			p1=['']
    		if self.part2intvar.get() == 1:
    			p2=self.p2
    		else:
    			p2=['']
    		if self.part3intvar.get() == 1:
    			p3=self.p3
    		else:
    			p3=['']
    		if self.part4intvar.get() == 1:
    			p4=self.p4
    		else:
    			p4=['']
    		nbposs=len(p1)*len(p2)*len(p3)*len(p4)
    		textposs='le nombre de possibilités est de '+str(nbposs)+'\n Continuer ?'
    		Label(self.alert,text=textposs).grid(row=0, column=0,columnspan=2)
    		Button(self.alert,text='Oui',command=self.generate).grid(row=1,column=0)
    		Button(self.alert,text='Non',command=self.alert.destroy).grid(row=1,column=1)
    Et voici le message d'erreur que j'obtiens :

    Exception in Tkinter callback
    Traceback (most recent call last):
    File "lib-tk/Tkinter.py", line 1406, in __call__
    return self.func(*args)
    File "NGen4.py", line 349, in alertposs
    self.alert.positionfrom(who=self.fen)
    File "lib-tk/Tkinter.py", line 1570, in wm_positionfrom
    return self.tk.call('wm', 'positionfrom', self._w, who)
    TclError: bad argument ".": must be program or user

    Mes questions sont donc les suivantes : Qu'entend-il par program ou user ? Que faut-il donc mettre comme argument à positionfrom ? s'il vous plaît

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Salut,

    Voilà ce que dit la docstring de la méthode positionfrom() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> print Toplevel.positionfrom.__doc__
     
    Instruct the window manager that the position of this widget shall
    be defined by the user if WHO is "user", and by its own policy if WHO is
    "program".
    Le paramètre who n'accepte que deux valeurs : la chaîne "user" ou la chaîne "program".

  3. #3
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Oùlala, désolé pour cette réponse tardive, (mieux vaux tard que jamais toutefois...), merci pour ta réponse. J'avais bien compris qu'il demandait un "user" ou un "program", mais je ne vois pas du tout à quoi ça peut correspondre, à quoi il fait référence... utilisateur de quoi ? quel programme ? Entre-temps j'ai renoncé à me servir de cette fonction, mais ça m'intrigue cette histoire... J'ai beau avoir cherché des exemple, je suis toujours bredouille, "broucouille" comme dirais certains chasseurs de galilette cendrées ... Donc si j'ai bien compris, j'ai juste à mettre entre parenthèses soit "user" soit "program" ? C'est aussi bête que ça ? Ben mince alors... moi qui ai cherché midi à quatorze heures alors que la soluce était écrite blanc sur bordeaux en face de moi ... Encore merci

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Je t'avoue que je n'ai aucune idée de l'utilité de cette méthode.
    J'ai remarqué que les fenêtres (widgets Tk et Toplevel) ont pas mal de méthodes en rapport avec le gestionnaire de fenêtres (wm_* et les winfo_*, pour Windows Manager), peut-être que positionfrom en fait partie.

    Si tu ouvres une fenêtre Toplevel au dessus de ta fenêtre principale, c'est le WM de ton bureau (Dans le libre on Metacity pour GNOME, XFWM pour Xfce, Kwin pour KDE, etc. pour les OS windows et mac, je pense qu'il n'y a que celui fourni par défaut) qui va décider de son emplacement, et il risque fort de la placer n'importe où sur ton bureau.
    Généralement, les WM essaient de faire un placement intelligent, c'est à dire de positionner les nouvelles fenêtres là où il n'y en a aucune si possible.

    Tu peux aussi indiquer que ce Toplevel n'est qu'une fenêtre "enfant" provenant de la fenêtre principal, avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fen_toplevel.transient(fen_toplevel.master)
    (master est un attribut automatique pour tous les widgets)
    Et là, ton WM va avoir un comportement différent.
    Il va soit la centrer au dessus de la fenêtre parent, soit la décaler légèrement par rapport au coin supérieur gauche de la fenêtre parent.
    Il va aussi ne pas ajouter cette nouvelle fenêtre dans la barre des tâches, puisqu'il va comprendre qu'elle fait partie de la même application.
    Pour le positionnement, il peut aussi ne rien faire comme je te l'ai dit, chaque WM est différent.

    Mais dans tous les cas, tu peux forcer "à la main" sa position :

    - fen.winfo_width, fen.winfo_height pour déterminer la largeur et la hauteur
    - fen.winfo_rootx, fen.winfo_rooty pour le coin supérieur gauche de la fenêtre
    - fen.self.geometry("+%d+%d" % (x, y)) pour placer à la main une fenêtre à un point w, y

    Avec ceci, tu peux faire ce que tu veux, quelque soit la dimension de ta fenêtre et la résolution de l'écran de l'utilisateur.

    Petite démo qui te permet t'indiquer le décalage en hauteur et en largeur, en nombre de pixels, d'une fenêtre Toplevel par rapport à son parent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from Tkinter import *
     
    def lancer_popup():
    	fen = Toplevel()
    	parent = fen.master
     
    	fen.title("Popup")
    	fen.config(bd=10)
    	fen.resizable(height=False, width=False)
    	fen.grab_set()
    	fen.transient(parent)
     
    	if w_entry.get().isdigit(): x = int(w_entry.get())
    	else: x = 30
     
    	if h_entry.get().isdigit(): y = int(h_entry.get())
    	else: y = 30
     
    	fen.geometry("+%d+%d" % (parent.winfo_rootx()+x, parent.winfo_rooty()+y))
    	Button(fen, text="Postionné à +%d +%d pixels" % (x, y), command=fen.destroy).pack()
     
    root = Tk()
    root.config(bd=100)
     
    Button(root, text="Popup", command=lancer_popup).pack(pady=5)
    Label(root, text="Hauteur :").pack()
    h_entry = Entry(bg="white")
    h_entry.pack()
    h_entry.insert(END, 0)
     
    Label(root, text="Largeur : ").pack()
    w_entry = Entry(bg="white")
    w_entry.pack()
    w_entry.insert(END, 0)
     
    root.mainloop()
    Bonne chasse

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Encore une réponse plus que tardive de ma part ... En tous cas merci pour ces précieuse informations, j'avais fini par lâcher l'affaire... Pour finalement y revenir aujourd'hui... Encore merci car c'est exactement ce que je cherchais à faire (positionner le top level), j'ai pas encore test cause ch'uis un peu long à la détente pour bien comprendre mais thanx


    EDIT : après un rapide essai de la méthode transient, il apparaît (en tous cas sur GNOME) que c'est parfait ! Excellent !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fichier ini comment s'en servir ?
    Par yaumme dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/01/2007, 19h00
  2. [VBA-E] Mode L1C1 comment s'en servir
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/10/2005, 18h08
  3. Que sont les StringTables et comment s'en servir?
    Par Crisanar dans le forum Windows
    Réponses: 6
    Dernier message: 05/11/2004, 16h57
  4. [PowerAMC] Comment s'en servir pour creer une base?
    Par Elmilouse dans le forum Access
    Réponses: 2
    Dernier message: 27/07/2004, 09h53
  5. comment peut se servire d'une Api en delphi
    Par maamar dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 22/02/2003, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo