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 :

GUI chemin de fichier tkinter


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Par défaut GUI chemin de fichier tkinter
    Bonjour,

    Je débute sur Python, et j'ai réalisé un petit programme qui fonctionne avec 3 fichiers (1 x .fa et 2x .csv)
    Je souhaite faire une interface graphique avec tkinter où l'utilisateur parcours ses dossiers et sélectionne les 3 fichiers
    Depuis cette interface, le programme tournera avec ces 3 fichiers.
    J'ai un début, mais j'ai du mal à avancer... et j'ai donc besoin d'un petit coup de pouce!

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/env python
    # -*- coding: Utf-8 -*-
     
    from tkinter import *
    from tkinter.filedialog import askopenfilename
    from tkinter.messagebox import showerror
     
    #Fenêtre
    racine = Tk()
    racine.title("Programme")
    racine.geometry("800x400")
     
    #Fonctions
    def loadfile():
    	filename = askopenfilename()
    	return
     
    #Zone de texte
    cadre_texte = Frame(racine, width = 500, height = 100)
    cadre_texte.pack()
    cadre_texte.pack_propagate(False)
    texte = Label(cadre_texte, text = "Sélectionnez les fichiers")
    texte.pack(expand = 1, anchor = CENTER)
     
    #Séquence de référece
    frame1 = LabelFrame(racine, text = "Séquence de référence", width = 500, height = 60) #Cadre 1
    frame1.pack()
    frame1.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame1, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton1 = Button(frame1, text = "Parcourir", command = loadfile)
    bouton1.pack()
     
    #Coverage
    frame2 = LabelFrame(racine, text = "Coverage", width = 500, height = 60) #Cadre 2
    frame2.pack()
    frame2.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame2, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton2 = Button(frame2, text = "Parcourir", command = loadfile)
    bouton2.pack()
     
    #Conflits
    frame3 = LabelFrame(racine, text = "Conflits", width = 500, height = 60) #Cadre 3
    frame3.pack()
    frame3.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame3, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton3 = Button(frame3, text = "Parcourir", command = loadfile)
    bouton3.pack()
     
    #Quitter
    bou_quitter = Button(racine,
    	text = "Quitter",
    	command = racine.destroy)
    bou_quitter.pack(side = "right", expand = 1, anchor = "se")
     
    racine.mainloop()
    Ce qu'il me manque:

    - il faudrait que le chemin du fichier sélectionné s'affiche dans la zone "Entry" au dessus du bouton parcourir
    - j'aimerais que la zone Entry soit plus longue et sur la même ligne que le bouton parcourir
    - comment faire après pour que le chemin du fichier s'intègre dans mon programme?

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #Une fois que le fichier est sélectionné, je voudrais avoir:
    file_seq = "chemin_du_fichier de la séquence de référence"
    file_cov = "chemin_du_fichier coverage"
    file_conf = "chemin_du_fichier conflits"

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    Bonjour,

    Je débute sur Python, et j'ai réalisé un petit programme qui fonctionne avec 3 fichiers (1 x .fa et 2x .csv)
    Je souhaite faire une interface graphique avec tkinter où l'utilisateur parcours ses dossiers et sélectionne les 3 fichiers
    Depuis cette interface, le programme tournera avec ces 3 fichiers.
    J'ai un début, mais j'ai du mal à avancer... et j'ai donc besoin d'un petit coup de pouce!

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/env python
    # -*- coding: Utf-8 -*-
     
    from tkinter import *
    from tkinter.filedialog import askopenfilename
    from tkinter.messagebox import showerror
     
    #Fenêtre
    racine = Tk()
    racine.title("Programme")
    racine.geometry("800x400")
     
    #Fonctions
    def loadfile():
    	filename = askopenfilename()
    	return
     
    #Zone de texte
    cadre_texte = Frame(racine, width = 500, height = 100)
    cadre_texte.pack()
    cadre_texte.pack_propagate(False)
    texte = Label(cadre_texte, text = "Sélectionnez les fichiers")
    texte.pack(expand = 1, anchor = CENTER)
     
    #Séquence de référece
    frame1 = LabelFrame(racine, text = "Séquence de référence", width = 500, height = 60) #Cadre 1
    frame1.pack()
    frame1.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame1, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton1 = Button(frame1, text = "Parcourir", command = loadfile)
    bouton1.pack()
     
    #Coverage
    frame2 = LabelFrame(racine, text = "Coverage", width = 500, height = 60) #Cadre 2
    frame2.pack()
    frame2.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame2, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton2 = Button(frame2, text = "Parcourir", command = loadfile)
    bouton2.pack()
     
    #Conflits
    frame3 = LabelFrame(racine, text = "Conflits", width = 500, height = 60) #Cadre 3
    frame3.pack()
    frame3.pack_propagate(False)
     
    saisie = StringVar()
    chemin = Entry(frame3, textvariable = saisie, width = 30)
    chemin.pack()
     
    bouton3 = Button(frame3, text = "Parcourir", command = loadfile)
    bouton3.pack()
     
    #Quitter
    bou_quitter = Button(racine,
    	text = "Quitter",
    	command = racine.destroy)
    bou_quitter.pack(side = "right", expand = 1, anchor = "se")
     
    racine.mainloop()
    Ce qu'il me manque:

    - il faudrait que le chemin du fichier sélectionné s'affiche dans la zone "Entry" au dessus du bouton parcourir
    - j'aimerais que la zone Entry soit plus longue et sur la même ligne que le bouton parcourir
    - comment faire après pour que le chemin du fichier s'intègre dans mon programme?

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #Une fois que le fichier est sélectionné, je voudrais avoir:
    file_seq = "chemin_du_fichier de la séquence de référence"
    file_cov = "chemin_du_fichier coverage"
    file_conf = "chemin_du_fichier conflits"

    Bonjour,

    Y a-t-il une raison technique à l'utilisation d'objets de dimensions rigides ?

    Je sais que ce n'est jamais facile à appréhender, mais vous devriez penser programmation par composants, en encapsulant par exemple une Entry avec son étiquette Label personnelle et son bouton "Parcourir" dans une classe FileEntry, toujours par exemple donné :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    import tkinter as TK
    import tkinter.filedialog as FD
    import tkinter.messagebox as MB
     
    from tkinter import ttk
     
    # n'ayez pas peur de créer des composants:
     
    class FileEntry (ttk.Frame):
     
        def __init__ (self, master=None, **kw):
     
            # super class inits
     
            ttk.Frame.__init__(self, master)
     
            # widget inits
     
            self.init_widget(**kw)
     
        # end def
     
     
        def init_widget (self, **kw):
     
            # component inits
     
            self.label = ttk.Label(
     
                self,
     
                text=kw.get(
     
                    "label",
     
                    "Veuillez sélectionner un fichier, SVP:"
                )
            )
     
            self.file_path = TK.StringVar()
     
            self.entry = ttk.Entry(
     
                self,
     
                textvariable=self.file_path
            )
     
            self.button = ttk.Button(
     
                self,
     
                text="Parcourir",
     
                command=self.slot_browse,
     
                underline=0,
            )
     
            # layout inits
     
            self.label.pack(side=TK.TOP, expand=0, fill=TK.X)
     
            self.entry.pack(side=TK.LEFT, expand=1, fill=TK.X)
     
            self.button.pack(side=TK.LEFT, expand=0, fill=TK.NONE, padx=5)
     
        # end def
     
     
        def slot_browse (self, tk_event=None, *args, **kw):
     
            # browse file path
     
            _fpath = FD.askopenfilename()
     
            # set entry's contents with file_path control variable
     
            self.file_path.set(_fpath)
     
        # end def
     
     
        def get_path (self):
     
            return self.file_path.get()
     
        # end def
     
    # end class FileEntry
     
     
     
    # petit test entre amis
     
    root = TK.Tk()
     
    root.title("Ma bidouille")
     
    labelframe = ttk.LabelFrame(
     
        root,
     
        text="Faites vos jeux, rien ne va plus",
     
        padding="5px",
    )
     
    btn_quit = ttk.Button(
     
        root,
     
        text="Quitter",
     
        command=root.quit,
     
        underline=0,
    )
     
    # FileEntry subcomponents
     
    fileentry_sequence = FileEntry(labelframe, label="Séquence de référence :")
     
    fileentry_coverage = FileEntry(labelframe, label="Coverage :")
     
    fileentry_conflicts = FileEntry(labelframe, label="Conflits :")
     
    # fileentry layout inits
     
    fileentry_sequence.pack(expand=0, fill=TK.X)
     
    fileentry_coverage.pack(expand=0, fill=TK.X)
     
    fileentry_conflicts.pack(expand=0, fill=TK.X)
     
    # labelframe layout inits
     
    labelframe.pack(side=TK.TOP, expand=1, fill=TK.BOTH, padx=5, pady=5)
     
    # petit extra
     
    ttk.Sizegrip(root).pack(
     
        side=TK.RIGHT, expand=0, fill=TK.Y, padx=5, pady=5,
    )
     
    # bouton quitter
     
    btn_quit.pack(side=TK.RIGHT, padx=0, pady=5)
     
    # pour récupérer un chemin de fichier
    # à un moment donné (ici: pour exemple)
     
    filepath_sequence = fileentry_sequence.get_path()
     
    filepath_coverage = fileentry_coverage.get_path()
     
    filepath_conflicts = fileentry_conflicts.get_path()
     
    # on entre dans la danse
     
    root.mainloop()
    En créant un composant FileEntry, vous pouvez ensuite le réutiliser aussi souvent que vous le souhaitez et un peu partout dans votre logiciel.

    @+.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Par défaut
    Bonjour et merci pour votre réponse.
    La raison tchnique est que je commence à peine sur Python et c'est ma toute première GUI...

    Donc je suis partie d'exemple et de tuto internet. Bien sûr j'ai vu passer les class et autres joyeusetés de fonction, mais j'avoue que je prévois de m'y aventurer par étape.
    Je vais donc de ce pas étudier le code donné pour voir si je peux m'en sortir avec ça

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Par défaut
    Wha!!!

    J'ai lu en diagonal, mais ton code est un vrai cours...
    Merci merci!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    Wha!!!

    J'ai lu en diagonal, mais ton code est un vrai cours...
    Merci merci!
    De rien. Service.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Par défaut
    Oui oui, merci mais j'avais déjà testé en console etc. (et pour info je travaille sur Linux, débutante également mais autant prendre de bonnes habitudes au plus tôt )

    Celà marche nickel et encore merci!

    Cependant maintenant, j'essais d'intégrer mon programme et là... ça coince au niveau de l'utilisation du fichier sélectionné (je sens que je suis pas loin mais... il doit me manquer une étape).

    Par exemple, j'ai

    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
    def sequence(filepath_sequence):
    	seq_ref = []
    	file_seq = open(filepath_sequence, "r")
    	read_seq = file_seq.readlines()
     
    	for line in read_seq:
    		if line[0] == ">":
    			ID = line[1:]
    			ID = ID.split()
    			ID = ID[0].split('|')
    			ID = ID[len(ID)-1].lower() #Nom de la seq de référence utilisée
    		else :
    			for i in line :
    				i = i.upper()
    				i = i.strip()
    				if i != "":
    					seq_ref.append(i)
    				else :
    					pass
    	print (seq_ref)
     
    sequence("Ref chik EU703760.fa")
    En fonction que j'avais écrit précemment.
    En gros,
    -je récupère une séquence ADN sur une base de donnée. Cette séquence est sous forme de fichier texte, dont la première ligne est l'ID.
    -ma fonction lit le fichier texte et me crée une liste (seq_ref) où chaque élément est un nucléotide

    Le but avec l'interface graphique: je sélectionne un fichier, puis en cliquant sur un bouton, cela active la fonction sequence.

    Du coup j'ai fais:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #!/usr/bin/env python
    # -*- coding: Utf-8 -*-
     
    import csv
    import tkinter as TK
    import tkinter.filedialog as FD
    import tkinter.messagebox as MB
    from tkinter import ttk
     
    class FileEntry (ttk.Frame):
    	def __init__ (self, master=None, **kw):
    	# super class inits
    		ttk.Frame.__init__(self, master)
    	# widget inits
    		self.init_widget(**kw)
    	# end def
    	def init_widget (self, **kw):
    	# component inits
    		self.label = ttk.Label(self, text=kw.get("label", "Veuillez sélectionner un fichier, SVP:"))
    		self.file_path = TK.StringVar()
    		self.entry = ttk.Entry(self, textvariable=self.file_path)
    		self.button = ttk.Button(self, text="Parcourir", command=self.slot_browse, underline=0,)
    	# layout inits
    		self.label.pack(side=TK.TOP, expand=0, fill=TK.X)
    		self.entry.pack(side=TK.LEFT, expand=1, fill=TK.X)
    		self.button.pack(side=TK.LEFT, expand=0, fill=TK.NONE, padx=5)
    	# end def
    	def slot_browse (self, tk_event=None, *args, **kw):
    	# browse file path
    		_fpath = FD.askopenfilename()
    	# set entry's contents with file_path control variable
    		self.file_path.set(_fpath)
    	# end def
    	def get_path (self):
    		return self.file_path.get()
    	# end def
    	# end class FileEntry
     
    # Interface
    root = TK.Tk()
    root.title("Programme")
     
    labelframe = ttk.LabelFrame(root, text="Sélection des fichiers", padding="5px",)
     
    # Size
    ttk.Sizegrip(root).pack(side=TK.RIGHT, expand=0, fill=TK.Y, padx=5, pady=5,)
     
    # FileEntry subcomponents
     
    fileentry_sequence = FileEntry(labelframe, label="Séquence de référence :")
    fileentry_coverage = FileEntry(labelframe, label="Coverage :")
    fileentry_conflicts = FileEntry(labelframe, label="Conflits :", underline=0,)
     
    # Bouton quitter
    btn_quit = ttk.Button(root, text="Quitter", command=root.quit)
     
    # Labelframe layout inits
    labelframe.pack(side=TK.TOP, expand=1, fill=TK.BOTH, padx=5, pady=5)
     
    # Fileentry layout inits
    fileentry_sequence.pack(expand=0, fill=TK.X)
    fileentry_coverage.pack(expand=0, fill=TK.X)
    fileentry_conflicts.pack(expand=0, fill=TK.X)
     
    # Boutons layout inits
    btn_quit.pack(side = TK.RIGHT, padx=20, pady=5)
     
    #####################################################
    # récupération de fichier
    filepath_sequence = fileentry_sequence.get_path()
    filepath_coverage = fileentry_coverage.get_path()
    filepath_conflicts = fileentry_conflicts.get_path()
    #####################################################
     
    def sequence(filepath_sequence):
    	seq_ref = []
    	file_seq = open(filepath_sequence, "r")
    	read_seq = file_seq.readlines()
     
    	for line in read_seq:
    		if line[0] == ">":
    			ID = line[1:]
    			ID = ID.split()
    			ID = ID[0].split('|')
    			ID = ID[len(ID)-1].lower() #Nom de la seq de référence utilisée
    		else :
    			for i in line :
    				i = i.upper()
    				i = i.strip()
    				if i != "":
    					seq_ref.append(i)
    				else :
    					pass
    	print (seq_ref)
     
    #Bouton test
    btn_test = ttk.Button(root, text="Test", command = sequence)
     
    # Boutons layout inits
    btn_quit.pack(side = TK.RIGHT, padx=20, pady=5)
    btn_test.pack(side = TK.RIGHT, padx=10, pady=5)
     
     
    root.mainloop()
    Mais non, ça veut pas...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    Bonjour et merci pour votre réponse.
    La raison tchnique est que je commence à peine sur Python et c'est ma toute première GUI...

    Donc je suis partie d'exemple et de tuto internet. Bien sûr j'ai vu passer les class et autres joyeusetés de fonction, mais j'avoue que je prévois de m'y aventurer par étape.
    Je vais donc de ce pas étudier le code donné pour voir si je peux m'en sortir avec ça
    Bonjour,

    Soyez la bienvenue dans le monde des "joyeusetés" Tkinter.

    Vous pouvez copier/coller le code que je vous ai fourni tel quel dans un fichier de script test.py puis le lancer :

    Dans une console type shell Linux / UNIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      $ cd ~/tmp # c'est un exemple de répertoire où vous pourriez mettre le fichier test.py
      $ ls
      test.py
      $ python3 test.py
    J'ai testé le code source sur ma bécane avant de vous le fournir et chez moi, il fonctionne OK.

    Sous Windows, je CROIS (je ne sais pas vraiment) que c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      > cd chemin\vers\dossier\temporaire
      > dir
      test.py
      > py test.py
    NB: cela fait presque 15 ans que j'ai décroché de MS-Windows, je ne sais plus comment on fait sur cet OS... désolé.

    @+.

Discussions similaires

  1. récuperation de chemin de fichiers !!!
    Par massiliaman dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 31/07/2007, 18h17
  2. [MFC]Problème de chemin de fichier
    Par benahpets dans le forum MFC
    Réponses: 3
    Dernier message: 06/09/2005, 13h07
  3. Chemin du fichier css
    Par dreamanoir dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 07/07/2005, 16h49
  4. Réponses: 3
    Dernier message: 21/06/2005, 16h18
  5. [SAX] Chemin du fichier XML
    Par mikemikemike dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 25/11/2004, 15h04

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