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 :

comment réaliser une sorte de tableur


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut comment réaliser une sorte de tableur
    bonjour,

    comment associer une Scrollbar à un Frame (par exemple), pour réaliser une sorte de tableur à base de case de type Entry disposées ?

    merci d'avance.

  2. #2
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    Une manière simple (mais pas forcement satisfaisante) est d'avoir recours à une tierce bibliothèque, genre Tix, et d'utiliser les modules tout fait (TixScrolledText) qui même s'ils ne correspondent pas exactement à ton besoin (mais peut être que pour d'autres ça sera le cas) feront l'affaire.

    Sinon, il faut céer un canevas, une frame dedans, et non seulement créer ta scroll bar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    self.scroll=Scrollbar(self.root,orient=VERTICAL) #ou HORIZONTAL
    self.scroll.grid(row=0,column=1,sticky=N+S)
    mais aussi l'associer à ton canevas (sur tu créer par la même occasion)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.can=Canvas(self.root,yscrollcommand=self.scroll.set) # ou xscrollcommand=self.scroll.set ou les 2
    #puis
    self.scroll.config(command=self.liste.yview) #ou xview
    et initialiser l'ascenseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    canvas.xview_moveto(0)
    # ou 
    canvas.yview_moveto(0)
    En plus, si ta fenêtre est redimensionable, un petit coup de
    grid_columnconfigure() et grid_rowconfigure() seront nécessaire.

    Voilà, j'ai peut être oublié des morceaux mais ça doit te mettre sur la voie

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    ça m'a l'air viable. et je préfère encore tenter de passer par cette voie que de refaire toute cette partie de mon programme et son interfaçage avec ma base de donnée. mon script est devenu trop bordélique et trop dégueulasse, et je n'ai pas assez de courage pour reprendre.
    par contre, je pense que je devrait appliquer assez facilement ce genre de bidouillage.

    merci ! (je teste cet après midi ou demain)

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    euh ben en fait, ça marche pas top. je créé bien un Canvas et un Scrollbar, je les associe bien l'un à l'autre, mais quand je dispose quelque chose sur mon Canvas, qui a une taille supérieure à celui-ci, la scrollbar reste désactivée (grisée).

    il n'y aurais pas un petit exemple complet qui marche ?

    parce qu'en fait, j'essaie d'utiliser le moins de bibliothèques possibles. étant donné que je devrait faire une distribution en créant un exécutable avec py2exe,moins j'aurais de module à charger pour le bon fonctionnement de mon programme, moins de chance j'aurais de m'arracher les cheveux sur la "pseudo-compilation".

  5. #5
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    T'arrache pas les cheveux, ils tomberont d'eux même bien assez tôt...

    Je regarde ça après manger...

  6. #6
    Membre actif Avatar de Gaillac
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 165
    Points : 209
    Points
    209
    Par défaut
    Effectivement.

    Moi j'avais fait ça directement avec une zone texte dans le passé.

    Si je mets une zone texte dans le canevas et que c'est le canevas qui contrôle la scroll bar, ça ne marche pas.

    Question : pourquoi?

    démonstration d'un truc qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                    self.scroll=Tkinter.Scrollbar(self,orient=Tkinter.VERTICAL)
                    self.scroll.grid(row=0,column=3,sticky=Tkinter.N+Tkinter.S)
     
                    self.texte=Tkinter.Text(self,width=60,height=10)
                    self.texte.config(yscrollcommand=self.scroll.set)
                    self.texte.grid(row=0,column=0)
     
                    self.scroll.config(command=self.texte.yview)
    Là quand la zone de texte grandit elle agit sur les scroll (et réciproquement)

    Mais pourquoi quand la zone texte est inclue dans un canevas ça ne marche pas? Est-ce que le canevas ne grandit pas? à investiguer.

    2ème cas, si tu à ton texte dans ton caneva et que tu lis la scroll barre au 2, ça marche aussi.

    par contre c'est pas beau,ne fait pas ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    self.scroll=Tkinter.Scrollbar(self,orient=Tkinter.VERTICAL)
                    self.scroll.grid(row=0,column=3,sticky=Tkinter.N+Tkinter.S)
     
                    self.can=Tkinter.Canvas(self,yscrollcommand=self.scroll.set)
                    self.can.grid(row=0,column=0,columnspan=3)
     
                    self.texte=Tkinter.Text(self.can,width=60,height=10)
                    self.texte.config(yscrollcommand=self.scroll.set)
                    self.texte.grid(row=0,column=0)
     
                    self.scroll.config(command=self.can.yview)
                    self.scroll.config(command=self.texte.yview)
    edit : piste à explorer : self.can.config(scrollregion=(left, top, right, bottom))

  7. #7
    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
    Citation Envoyé par Gaillac Voir le message
    edit : piste à explorer : self.can.config(scrollregion=(left, top, right, bottom))
    Je confirme que cela marche très bien de cette façon, en fait le principe est d'avoir une ou deux variable (au choix) qui representera l'espace actuellement occupé par l'ensemble des widgets (incluant leur 'inter-espacement') et de vérifier avant d'ajouter un widget si l'espace restant (ScrollRegion-VarEspaceOccupé) sera suffisant ou non, ce qui necessite de connaître la taille du widget que l'on veut placer. Si l'espace restant est insuffisant, on redéfini le scrollRegion (il faut savoir à propos de ce dernier que si l'on essai de récupérer sa valeur, elle sera retournée sous la forme d'un string), pour ma part j'en profite pour pour redéfinir la taille de la Frame mais c'est peut-être inutile, puis on procède à l'insertion du widget...

    PS: Je ne sais pas vraiment si le fait d'utiliser la méthode de placement grid changera quoi que ce soit à cette façon de faire, mais en ce qui me concerne je n'utilise que place pour ce cas de figure (je trouve ça plus précis...)

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/01/2008, 09h17
  2. [SQL] Comment réaliser une fonction d'incrementation ?
    Par da_latifa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/12/2005, 11h14
  3. Réponses: 4
    Dernier message: 25/12/2005, 18h46
  4. Réponses: 1
    Dernier message: 09/12/2005, 13h43
  5. [FLASH MX] Comment réaliser une forme dentelée
    Par celina5880 dans le forum Flash
    Réponses: 4
    Dernier message: 04/11/2004, 17h48

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