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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    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
    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é.

    @+.

  6. #6
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    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...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Bon, j'ai trouvé finalement!

    D'un côté j'aurais mon fichier avec toutes mes fonctions, de l'autre un fichier avec la GUI.

    fichier fonctions:

    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
    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)
    fichier gui:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def function_bouton_test():
    	sequence(fileentry_sequence.get_path())
    btn_test = ttk.Button(root, text="Test", command = function_bouton_test)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    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

    (snip)(snip)

    Mais non, ça veut pas...
    Pour pouvoir vous aider, il me faudrait voir au moins les 5-6 premières lignes d'un fichier séquence ADN typique que vous voulez traiter.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    Bon, j'ai trouvé finalement!

    D'un côté j'aurais mon fichier avec toutes mes fonctions, de l'autre un fichier avec la GUI.

    fichier fonctions:

    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
    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)
    fichier gui:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def function_bouton_test():
    	sequence(fileentry_sequence.get_path())
    btn_test = ttk.Button(root, text="Test", command = function_bouton_test)

    C'est un peu en ordre dispersé, mais oui, bon, si vous voulez.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def function_bouton_test():
    	sequence(fileentry_sequence.get_path())
    btn_test = ttk.Button(root, text="Test", command = function_bouton_test)
    Oui, il suffit de passer à votre fonction sequence() le chemin de fichier récupéré dans fileentry_sequence, en effet.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    C'est encore moi!

    J'ai réussi à faire exactement ce que je voulais... grâce à toi!

    Voulant toujours aller plus loin, je voudrai rajouter un élément: un fichier de sortie.
    Je m'explique: les 3 éléments (sequence, coverage et conflits) sont des éléments pour sélectionner et récupérer des fichiers utilisés dans mon programme.
    Le programme tourne et crée un fichier de sortie.

    Pour le moment, il crée un fichier nommé "tableau.csv" (défini dans mon programme) mais je voudrais que l'utilisateur puisse choisir où enregistrer son fichier et le nom...

    GUI:
    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
    #!/usr/bin/env python
    # -*- coding: Utf-8 -*-
     
    import tkinter as TK
    import tkinter.filedialog as FD
    import tkinter.messagebox as MB
    from tkinter import ttk
    import Programmefct
     
    ###############
     
    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",)
     
    # FileEntry subcomponents
    fileentry_sequence = FileEntry(labelframe, label="Séquence de référence :")
    fileentry_coverage = FileEntry(labelframe, label="Coverage :")
    fileentry_conflits = FileEntry(labelframe, label="Conflits :", underline=0,)
     
     
    # Bouton action
    def bouton_action():
    	Programmefct.tab_csv(fileentry_sequence.get_path(), fileentry_coverage.get_path(), fileentry_conflits.get_path())
     
    btn_action = ttk.Button(root, text="Action", command = bouton_action)
     
    # 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)
     
    # Size
    ttk.Sizegrip(root).pack(side=TK.RIGHT, expand=0, fill=TK.Y, padx=5, pady=5,)
     
    # Fileentry layout inits
    fileentry_sequence.pack(expand=0, fill=TK.X)
    fileentry_coverage.pack(expand=0, fill=TK.X)
    fileentry_conflits.pack(expand=0, fill=TK.X)
     
     
    # Boutons layout inits
    btn_quit.pack(side = TK.RIGHT, padx=20, pady=5)
    btn_action.pack(side = TK.RIGHT, padx=10, pady=5)
     
    ###############
     
    root.mainloop()
    Programme:
    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
    #!/usr/bin/python3
    #-*-coding:Utf-8-*-
     
    import csv
     
    ######
     
    #Calcul de fréquences
    def frequence(nb,total):
    	"""Calculate a frequency. If total=0, return 0
            """
    	try:
    		return nb/total
    	except ZeroDivisionError:
    		return 0
     
    ######
     
    #Tableau séquence de référence/coverage
     
    def tableau_init(file_ref, file_cov):
    	#Lecture de la séquence de référence
    	seq = []
    	_open = open(file_ref, "r")
    	read = _open.readlines()
     
    	for line in read:
    		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.append(i)
    				else :
    					pass
    	#Lecture du coverage
    	coverage = []
    	_open = open(file_cov, "r")
    	read = csv.reader(_open)
     
    	for line in read:
    		line = " ".join(line)
    		line = line.replace(";","").replace('"'," ")
    		line = line.split()
    		if "Value" in line:
    			pass
    		else:
    			line = [int(i) for i in line]
    			coverage.append(line[1])
    	#Création du tableau
    	tableau = []
    	for i in list(range(len(seq))): #Position et seq. ref et consensus + reads
    		(pos_cons, seq_cons, A, T, G, C, GAP) = ("-", seq[i], 0, 0, 0, 0, 0)
     
    		line = [i+1, seq[i], coverage[i]]
    		if seq[i] == "A":
    			A = coverage[i]
    		elif seq[i] == "T":
    			T = coverage[i]
    		elif seq[i] == "G":
    			G = coverage[i]
    		elif seq[i] == "C":
    			C = coverage[i]
    		line = [i+1, seq[i], coverage[i], pos_cons, seq_cons, A, T, G, C, GAP]
    		tableau.append(line)
     
    	return tableau
     
    #Tableau des conflits
     
    def tableau_conf(file_conf):
    	tableau = []
    	_open = open(file_conf, "r")
    	read = csv.reader(_open, delimiter=';')
     
    	for line in read: #lecture ligne par ligne
    		if "^" in line[0]: #ignore les insertion
    			pass
    		else:
    			line = " ".join(line)
    			line = line.replace(".", "").replace("(","").replace(")","").replace(",","")
    			line = line.split()
    			(pos_ref, pos_cons, seq_cons) = (line[0], line[1], line[2])
     
    			i = 6 #comptage des reads
    			taille = len(line)-2 
    			(A, T, G, C, GAP) = (0,0,0,0,0)
    			while (i < taille):
    				if line[i] == "A" or line[i] == "AA":
    					i=i+1
    					A = line [i]
    				elif line[i] == "T" or line[i] == "TT":
    					i=i+1
    					T = line [i]
    				elif line[i] == "G" or line[i] == "GG":
    					i=i+1
    					G = line [i]
    				elif line[i] == "C" or line[i] == "CC":
    					i=i+1
    					C = line [i]
    				elif line[i] == "-" or line[i] == "--":
    					i=i+1
    					GAP = line [i]
    				i = i+1
     
    			line_seq = [line[0], line[1], line[2]]
    			line_data = [A, T, G, C, GAP]
    			line_data = [int(i) for i in line_data]
    			line = line_seq + line_data
     
    			tableau.append(line)
     
    	return tableau
     
    #Tableau séquence de référence/coverage/conflits
     
    def tableau_all(file_seq, file_cov, file_conf):
    	tab_init = tableau_init(file_seq, file_cov)
    	tab_conf = tableau_conf(file_conf)
     
    	for i in tab_conf[1:]:
    		numero = int(i[0])-1
    		tab_init[numero][3:] = i[1:]
    	return tab_init
     
    #Fréquences
     
    def tableau_freq(file_seq, file_cov, file_conf):
    	tableau = tableau_all(file_seq, file_cov, file_conf)
     
    	for i in tableau:
    	#	(nbA, nbT, nbG, nbC, nbGAP, nbcov) = (i[5], i[6], i[7], i[8], i[9], i[2])
    		total = i[2] - i[9]
    		freqA = frequence(i[5], total)
    		freqA = str(freqA).replace(".", ",")
    		i.append(freqA)
    		freqT = frequence(i[6], total)
    		freqT = str(freqT).replace(".", ",")
    		i.append(freqT)
    		freqG = frequence(i[7], total)
    		freqG = str(freqG).replace(".", ",")
    		i.append(freqG)
    		freqC = frequence(i[8], total)
    		freqC = str(freqC).replace(".", ",")
    		i.append(freqC)
     
    	return tableau
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf):
    	file_out = open("tableau.csv", "w")
    	writer = csv.writer(file_out, delimiter = ";")
     
    	tableau = tableau_freq(file_seq, file_cov, file_conf)
    	writer.writerow(["Position","Seq_ref","Coverage","Pos_consensus","Seq_consensus","nbA","nbT","nbG","nbC","nbGAP", "freqA", "freqT", "freqG", "freqC"])
    	for i in list(range(len(tableau))):
    		writer.writerow(tableau[i])

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    C'est encore moi!

    J'ai réussi à faire exactement ce que je voulais... grâce à toi!

    Voulant toujours aller plus loin, je voudrai rajouter un élément: un fichier de sortie.
    Je m'explique: les 3 éléments (sequence, coverage et conflits) sont des éléments pour sélectionner et récupérer des fichiers utilisés dans mon programme.
    Le programme tourne et crée un fichier de sortie.

    Pour le moment, il crée un fichier nommé "tableau.csv" (défini dans mon programme) mais je voudrais que l'utilisateur puisse choisir où enregistrer son fichier et le nom...

    GUI:
    (snip)(snip)
    Bon OK, je vous donne le raisonnement, mais c'est vous qui trouvez la soluce:

    1. Tout comme nous avons demandé à l'utilisateur le nom d'un fichier à ouvrir avec FD.askopenfilename(), on doit certainement pouvoir demander un nom de fichier à "enregistrer sous..." avec un FD.ask???? (à vous de trouver lequel) ;
    2. probablement que dans bouton_action() nous allons devoir demander le nom de fichier à enregistrer AVANT de lancer tab_csv() ;
    3. il faudra certainement conserver ce nom quelque part pour vérifier que l'utilisateur a bien renseigné ce nom de fichier ;
    4. s'il n'a pas renseigné ce nom de fichier, mettons en cliquant sur le bouton "Annuler" de la boîte de dialogue "Enregistrer sous...", que devons-nous faire ?
    5. s'il a bien renseigné ce nom de fichier, comment le fournir à tab_csv() ?
    6. que devrait-on faire lorsque la sauvegarde du fichier est réussie ?
    7. puisque vous séparez GUI et fonctions applicatives (c'est une bonne chose), comment informer le GUI du bon déroulement de la sauvegarde du fichier de sortie ?

    Que de questions !

    Mais je suis sûr que vous trouverez toutes les réponses.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par tarball69 Voir le message
    1. Tout comme nous avons demandé à l'utilisateur le nom d'un fichier à ouvrir avec FD.askopenfilename(), on doit certainement pouvoir demander un nom de fichier à "enregistrer sous..." avec un FD.ask???? (à vous de trouver lequel) ;
    FD.asksaveasfilename()
    Citation Envoyé par tarball69 Voir le message
    2. probablement que dans bouton_action() nous allons devoir demander le nom de fichier à enregistrer AVANT de lancer tab_csv() ;
    3. il faudra certainement conserver ce nom quelque part pour vérifier que l'utilisateur a bien renseigné ce nom de fichier ;
    4. s'il n'a pas renseigné ce nom de fichier, mettons en cliquant sur le bouton "Annuler" de la boîte de dialogue "Enregistrer sous...", que devons-nous faire ?
    5. s'il a bien renseigné ce nom de fichier, comment le fournir à tab_csv() ?
    6. que devrait-on faire lorsque la sauvegarde du fichier est réussie ?
    7. puisque vous séparez GUI et fonctions applicatives (c'est une bonne chose), comment informer le GUI du bon déroulement de la sauvegarde du fichier de sortie ?
    Alors la première question était facile, les suivantes...
    Je vois à peu près le raisonnement mais j'avais commencé à faire un truc (peut-être pas très beau mais bon... au moins c'est moi qui l'ai fait! ou presque...)

    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
    #!/usr/bin/env python
    # -*- coding: Utf-8 -*-
     
    import tkinter as TK
    import tkinter.filedialog as FD
    import tkinter.messagebox as MB
    from tkinter import ttk
    import ProgrammeFCT
     
    ###############
     
    class FileEntry (ttk.Frame):
    	def __init__ (self, master=None, **kw):
    		ttk.Frame.__init__(self, master)
    		self.init_widget(**kw)
     
    	def init_widget (self, **kw):
    		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,)
     
    		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)
     
    	def slot_browse (self, tk_event=None, *args, **kw):
    		_fpath = FD.askopenfilename()
    		self.file_path.set(_fpath)
     
    	def get_path (self):
    		return self.file_path.get()
     
    ###############
     
    class FileOut (ttk.Frame):
    	def __init__ (self, master=None, **kw):
    		ttk.Frame.__init__(self, master)
    		self.init_widget(**kw)
     
    	def init_widget (self, **kw):
    		self.label = ttk.Label(self, text=kw.get("label", "Veuillez entrer un nom de 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,)
     
    		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)
     
    	def slot_browse (self, tk_event=None, *args, **kw):
    		_fpath = FD.asksaveasfilename()
    		self.file_path.set(_fpath)
     
    	def get_path (self):
    		return self.file_path.get()
     
    ###############
     
    # Interface
    root = TK.Tk()
    root.title("Programme")
    root.geometry("800x300")
     
    labelframe = ttk.LabelFrame(root, text="Sélection des fichiers", padding="5px",)
    labelframe2 = ttk.LabelFrame(root, text="Fichier de sortie", padding="5px",)
     
    # FileEntry
    fileentry_sequence = FileEntry(labelframe, label="Séquence de référence :")
    fileentry_coverage = FileEntry(labelframe, label="Coverage :")
    fileentry_conflits = FileEntry(labelframe, label="Conflits :", underline=0,)
     
    #FileOut
    fileout = FileOut(labelframe2, label="Nom :")
     
    # Bouton action
     
    def bouton_action():
    	ProgrammeFCT.tab_csv(fileentry_sequence.get_path(), fileentry_coverage.get_path(), fileentry_conflits.get_path(), fileout.get_path())
     
    btn_action = ttk.Button(root, text="Générer", underline = 0, command = bouton_action)
     
    # Bouton quitter
    btn_quit = ttk.Button(root, text="Quitter", underline = 0, command=root.quit)
     
    ###############
     
    # Labelframe layout inits
    labelframe.pack(side=TK.TOP, expand=1, fill=TK.BOTH, padx=5, pady=5)
    labelframe2.pack(side=TK.TOP, expand=1, fill=TK.BOTH, padx=5, pady=5)
     
    # Size
    ttk.Sizegrip(root).pack(side=TK.RIGHT, expand=0, fill=TK.Y, padx=5, pady=5,)
     
    # Fileentry layout inits
    fileentry_sequence.pack(expand=0, fill=TK.X)
    fileentry_coverage.pack(expand=0, fill=TK.X)
    fileentry_conflits.pack(expand=0, fill=TK.X)
     
    #FileOut
    fileout.pack(expand=0, fill=TK.X)
     
    # Boutons layout inits
    btn_quit.pack(side = TK.RIGHT, padx=20, pady=5)
    btn_action.pack(side = TK.RIGHT, padx=10, pady=5)
     
    ###############
     
    root.mainloop()
    et

    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
    166
    167
    168
    #!/usr/bin/python3
    #-*-coding:Utf-8-*-
     
    import csv
     
    ######
     
    #Calcul de fréquences
    def frequence(nb,total):
    	"""Calculate a frequency. If total=0, return 0
            """
    	try:
    		return nb/total
    	except ZeroDivisionError:
    		return 0
     
    ######
     
    #Tableau séquence de référence/coverage
     
    def tableau_init(file_ref, file_cov):
    	#Lecture de la séquence de référence
    	seq = []
    	_open = open(file_ref, "r")
    	read = _open.readlines()
     
    	for line in read:
    		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.append(i)
    				else :
    					pass
    	#Lecture du coverage
    	coverage = []
    	_open = open(file_cov, "r")
    	read = csv.reader(_open)
     
    	for line in read:
    		line = " ".join(line)
    		line = line.replace(";","").replace('"'," ")
    		line = line.split()
    		if "Value" in line:
    			pass
    		else:
    			line = [int(i) for i in line]
    			coverage.append(line[1])
    	#Création du tableau
    	tableau = []
    	for i in list(range(len(seq))): #Position et seq. ref et consensus + reads
    		(pos_cons, seq_cons, A, T, G, C, GAP) = ("-", seq[i], 0, 0, 0, 0, 0)
     
    		line = [i+1, seq[i], coverage[i]]
    		if seq[i] == "A":
    			A = coverage[i]
    		elif seq[i] == "T":
    			T = coverage[i]
    		elif seq[i] == "G":
    			G = coverage[i]
    		elif seq[i] == "C":
    			C = coverage[i]
    		line = [i+1, seq[i], coverage[i], pos_cons, seq_cons, A, T, G, C, GAP]
    		tableau.append(line)
     
    	return tableau
     
    #Tableau des conflits
     
    def tableau_conf(file_conf):
    	tableau = []
    	_open = open(file_conf, "r")
    	read = csv.reader(_open, delimiter=';')
     
    	for line in read: #lecture ligne par ligne
    		if "^" in line[0]: #ignore les insertion
    			pass
    		else:
    			line = " ".join(line)
    			line = line.replace(".", "").replace("(","").replace(")","").replace(",","")
    			line = line.split()
    			(pos_ref, pos_cons, seq_cons) = (line[0], line[1], line[2])
     
    			i = 6 #comptage des reads
    			taille = len(line)-2 
    			(A, T, G, C, GAP) = (0,0,0,0,0)
    			while (i < taille):
    				if line[i] == "A" or line[i] == "AA":
    					i=i+1
    					A = line [i]
    				elif line[i] == "T" or line[i] == "TT":
    					i=i+1
    					T = line [i]
    				elif line[i] == "G" or line[i] == "GG":
    					i=i+1
    					G = line [i]
    				elif line[i] == "C" or line[i] == "CC":
    					i=i+1
    					C = line [i]
    				elif line[i] == "-" or line[i] == "--":
    					i=i+1
    					GAP = line [i]
    				i = i+1
     
    			line_seq = [line[0], line[1], line[2]]
    			line_data = [A, T, G, C, GAP]
    			line_data = [int(i) for i in line_data]
    			line = line_seq + line_data
     
    			tableau.append(line)
     
    	return tableau
     
    #Tableau séquence de référence/coverage/conflits
     
    def tableau_all(file_seq, file_cov, file_conf):
    	tab_init = tableau_init(file_seq, file_cov)
    	tab_conf = tableau_conf(file_conf)
     
    	for i in tab_conf[1:]:
    		numero = int(i[0])-1
    		tab_init[numero][3:] = i[1:]
    	return tab_init
     
    #Fréquences
     
    def tableau_freq(file_seq, file_cov, file_conf):
    	tableau = tableau_all(file_seq, file_cov, file_conf)
     
    	for i in tableau:
    	#	(nbA, nbT, nbG, nbC, nbGAP, nbcov) = (i[5], i[6], i[7], i[8], i[9], i[2])
    		total = i[2] - i[9]
    		freqA = frequence(i[5], total)
    		freqA = str(freqA).replace(".", ",")
    		i.append(freqA)
    		freqT = frequence(i[6], total)
    		freqT = str(freqT).replace(".", ",")
    		i.append(freqT)
    		freqG = frequence(i[7], total)
    		freqG = str(freqG).replace(".", ",")
    		i.append(freqG)
    		freqC = frequence(i[8], total)
    		freqC = str(freqC).replace(".", ",")
    		i.append(freqC)
     
    	return tableau
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf, filetest):
    	if "csv" in filetest:
    		pass
    	else:
    		filetest = filetest + ".csv"
     
    	file_out = open(filetest, "w")
    	writer = csv.writer(file_out, delimiter = ";")
     
    	tableau = tableau_freq(file_seq, file_cov, file_conf)
    	writer.writerow(["Position","Seq_ref","Coverage","Pos_consensus","Seq_consensus","nbA","nbT","nbG","nbC","nbGAP", "freqA", "freqT", "freqG", "freqC"])
    	for i in list(range(len(tableau))):
    		writer.writerow(tableau[i])
    On ne se moque pas...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Kastapuce Voir le message
    FD.asksaveasfilename()


    Alors la première question était facile, les suivantes...
    Je vois à peu près le raisonnement mais j'avais commencé à faire un truc (peut-être pas très beau mais bon... au moins c'est moi qui l'ai fait! ou presque...)

    (snip)(snip)

    On ne se moque pas...
    Loin de moi cette idée : nous avons tous(tes) débuté un jour et nous avons tous(tes) beaucoup ramé avant d'y arriver.

    Programmer, c'est plus proche de l'art, de la peinture et de la poésie que d'une science stricte et rêche, même si on est parfois tentés de penser le contraire.

    Il faut énormément de rigueur et d'auto-discipline pour arriver à écrire du bon code.

    Alors, qu'avons-nous là ?

    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
     
    class FileOut (ttk.Frame):
    	def __init__ (self, master=None, **kw):
    		ttk.Frame.__init__(self, master)
    		self.init_widget(**kw)
     
    	def init_widget (self, **kw):
    		self.label = ttk.Label(self, text=kw.get("label", "Veuillez entrer un nom de 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,)
     
    		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)
     
    	def slot_browse (self, tk_event=None, *args, **kw):
    		_fpath = FD.asksaveasfilename()
    		self.file_path.set(_fpath)
     
    	def get_path (self):
    		return self.file_path.get()
     
    # Bouton action
     
    def bouton_action():
    	ProgrammeFCT.tab_csv(fileentry_sequence.get_path(), fileentry_coverage.get_path(), fileentry_conflits.get_path(), fileout.get_path())
    Waw! Un composant graphique pour demander un nom de fichier "enregistrer sous..." ?

    Aviez-vous au moins testé FD.asksaveasfilename() à vide (sur un coin de table) avant de vous lancer dans du code de composant graphique ?

    Non, la solution est BIEN PLUS SIMPLE que tout ça !

    Vous n'avez pas besoin d'un composant graphique, vu que FD.asksaveasfilename() vous en fournit déjà un.

    Tout ce que vous aviez à faire était de récupérer la valeur retour de FD.asksaveasfilename() qui est censée être le chemin complet de votre fichier de sortie.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Bouton action
     
    def bouton_action():
     
        _fpath = FD.asksaveasfilename()
     
        print("fichier de sortie :", _fpath)
     
        # pour l'instant, je désactive ceci:
        #~ ProgrammeFCT.tab_csv(fileentry_sequence.get_path(), fileentry_coverage.get_path(), fileentry_conflits.get_path(), fileout.get_path())
        # nous en reparlerons après
     
    # end def

    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
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf, filetest):
    	if "csv" in filetest:
    		pass
    	else:
    		filetest = filetest + ".csv"
     
    	file_out = open(filetest, "w")
    	writer = csv.writer(file_out, delimiter = ";")
     
    	tableau = tableau_freq(file_seq, file_cov, file_conf)
    	writer.writerow(["Position","Seq_ref","Coverage","Pos_consensus","Seq_consensus","nbA","nbT","nbG","nbC","nbGAP", "freqA", "freqT", "freqG", "freqC"])
    	for i in list(range(len(tableau))):
    		writer.writerow(tableau[i])
    On ne se moque pas...
    Tout d'abord, un if condition: ne nécessite pas forcément un else: ou un elif:

    Vous avez tout à fait le droit d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if something_true:
     
        do_something_cool_here()
     
    # end if
    ensuite, vous avez la logique contraire not :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if not something_true:
     
        do_something_anyway()
     
    # end if
    Tout ça pour dire que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf, filetest):
    	if "csv" in filetest:
    		pass
    	else:
    		filetest = filetest + ".csv"
    Peut s'écrire plus simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf, filetest):
     
    	if "csv" not in filetest:
    		filetest = filetest + ".csv"

    Bien que ce code reste néanmoins insuffisamment rigoureux, évidemment.

    Il eût été préférable d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #Création du tableau csv
     
    def tab_csv(file_seq, file_cov, file_conf, filetest):
     
    	if not str(filetest).lower().endswith(".csv"):
     
    		filetest += ".csv"
     
            # end if
    Et même ça, c'est encore insuffisant (vous n'avez pas vérifié que vos chemins de fichiers passés en arguments de fonction sont au minimum renseignés).

    Créer des fichiers à la sauvette peut provoquer des dégâts terribles (exemple fréquent : erreur sur le nom de fichier => écrasement de fichiers pré-existants contenant des données très importantes).

    Vous devriez prendre beaucoup plus de précautions que cela avant d'écrire quoi que ce soit sur un disque dur.

    @+

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