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

Python Discussion :

pb tkinter et treeview [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Par défaut pb tkinter et treeview
    Bonjour,

    Je débute en python, et je galère avec Tkinter et Treeview.

    J'essaye de créer un module qui permet de prendre n'importe quel fichier csv et de l'afficher dans une fenêtre en mode tableau.

    Cela marche presque , mais j'ai des problèmes (comme par hasard ):
    pour ajuster le treeview dans ma fenêtre que je souhaite dimensionnables ( treeview et fenêtre )
    et j'ai beaucoup de mal avec les scrollbars.

    Y aurait-il une âme charitable pour me filer un coup de main et m'indiquer où je me plante?
    Je suis d'ailleurs preneur de tous conseils

    A bientôt


    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
     
    import csv
    import tkinter as tk
    from tkinter import ttk
    from tkinter.messagebox import showinfo
    from tkinter import filedialog
     
       file_csv = filedialog.askopenfilename(title="Ouvrir le fichier CSV",
                                          filetypes=[('fichier de configuration', '.csv'), ('all files', '.*')],
                                          multiple=False)
        # rien de choisi --> sortie
        if not file_csv:
            return
     
        ffile = open(file_csv)
        csvreader = csv.reader(ffile, delimiter=";")
        header = next(csvreader)
     
        columns=header
        rows = []
     
        root1 = tk.Tk()
        root1.geometry("500x400")
        root1.title(file_csv)
     
        # define columns
        #columns = ('first_name', 'last_name', 'email')
     
        treev = ttk.Treeview(root1, columns=columns, show='headings')
     
        vsb = ttk.Scrollbar(root1, orient="vertical", command=treev.yview)
        vsb.place(relx=0.978, rely=0.175, relheight=0.713, relwidth=0.020)
     
        hsb = ttk.Scrollbar(root1, orient="horizontal", command=treev.xview)
        hsb.place(relx=0.014, rely=0.875, relheight=0.020, relwidth=0.965)
     
        treev.configure(xscrollcommand=hsb.set,yscrollcommand=vsb.set )
     
        # define headings
        for i in columns:
            treev.heading(i, text=i)
            treev.column(i, width=100, minwidth=100,stretch=0)
        for row in csvreader:
            rows.append(row)
        ffile.close()
     
        for contact in rows:
            treev.insert('', tk.END, values=contact)
     
        treev.grid(row=0, column=0, sticky='nsew')
     
        # run the app
        root1.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 716
    Par défaut
    Salut,

    Sauf à constater que vous n'utilisez pas le même geometry manager pour afficher les Scrollbar et la Treeview, le code fournit est trop incomplet pour reproduire ce que vous constatez.

    Après bien sûr, je pourrais l'arranger pour que ça marche, mais je ne suis pas un écrivain public: décrire un problème proprement... fait partie du boulot.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Le souci avec ton code c'est qu'il ne s'exécute pas. Il y a en effet une tabulation inutile à chaque ligne à partir de la ligne 8 (en Python les tabulations ont une signification donc on en met juste ce qu'il faut, ni plus, ni moins). Et il y a aussi ce return en ligne 13 qui ne se trouve pas dans une fonction.
    Et arriver ici avec un code en le présentant comme avoir été testé alors que ce n'est pas le cas on n'aime pas (même avec des erreurs aussi minimes).

    En supprimant chaque première tabulation et en remplaçant return par exit() ok ça marche mieux (en fait pas mal) mais malheureusement je ne connais pas assez Tk pour t'aider mieux (je suis du côté de Qt). wiztricks parle de geometry manager donc tu peux chercher par là. J'ai tenté de me familiariser récemment avec Tk et j'ai trouvé ces divers tutoriels pas mal faits
    https://python.doctor/page-tkinter-i...ython-tutoriel
    https://gayerie.dev/docs/python/python3/tkinter.html

    Et si tu veux te mettre à Qt (plus complet) c'est par ici.

    [edit]j'ai trouvé ce TP intéressant alors je l'ai écrit en PyQt
    Code python : 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
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
    import os
    import csv
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, fic=None, *args, **kwargs):
    		# Environnement ihm
    		self.__ihm={
    			"appli" : self,
    			"self" : self,
    			"mainWid" : None,
    			"fic" : fic,
    		}
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La translation des textes Qt prédéfinis dans le langage local
    		self.__trans=QTranslator(parent=self)
    		self.installTranslator(self.__trans)
    		self.__trans.load(
    			"qt_%s" % QLocale.system().name(),
    			QLibraryInfo.location(QLibraryInfo.TranslationsPath),
    		)
     
    		# Le widget principal
    		self.__ihm["mainWid"]=myMainWindow(self.__ihm)
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec_(self):
    		# Affichage du widget principal
    		self.__ihm["mainWid"].show()
     
    		# Appel méthode objet hérité
    		return super().exec_()
    	# exec_()
    # class myAppli
     
    # L'objet pour gérer ma fenêtre principale
    class myMainWindow(QMainWindow):
    	# Constructeur
    	def __init__(self, ihm, *args, **kwargs):
    		# Récupération environnement ihm
    		self.__ihm=dict(ihm)
    		self.__ihm["self"]=self
    		self.__ihm["mainWid"]=self
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		# Le widget central qui servira ensuite de référent
    		self.setCentralWidget(QWidget(parent=self))
     
    		# Le menu
    		self.setMenuBar(myMenu(self.__ihm, parent=self.centralWidget()))
     
    		# La zone qui va afficher le csv
    		self.__affich=myCSV(self.__ihm, parent=self.centralWidget())
     
    		# Le gestionnaire de positionnement principal
    		mainLayout=QVBoxLayout(self.centralWidget())
    		mainLayout.setSpacing(0)
    		mainLayout.setContentsMargins(10, 10, 10, 10)
    		mainLayout.addWidget(self.__affich, stretch=0)
     
    		# Dimensionnement final
    		self.resize(500, 300)
     
    		# Ouverture fichier
    		self.slotOpenFile() if self.__ihm["fic"] is None else self.__affich.load(self.__ihm["fic"])
    	# __init()
     
    	# Evènement fermeture fenêtre (méthode surchargée)
    	def closeEvent(self, event):
    		print(
    			"%s => %s.closeEvent(%s)" % (
    				self.sender().__class__.__name__,
    				self.__class__.__name__,
    				"%s (%s)" % (event.__class__.__name__, type(event)),
    			)
    		)
     
    		# Confirmation quitter
    		if QMessageBox.question(
    			self,
    			"Confirmation",
    			"Confirmez-vous vouloir quitter ?",
    			QMessageBox.Yes|QMessageBox.No,
    		) != QMessageBox.Yes:
    			# Refus de l'évènement (refus de la fermeture)
    			event.ignore()
     
    			# La fonction s'arrête là
    			return
    		# if
     
    		# Appel méthode objet hérité (comportement par défaut)
    		super().closeEvent(event)
    	# closeEvent()
     
    	# Le slot "ouvrir fichier"
            @pyqtSlot()
    	def slotOpenFile(self):
    		(fic, filtre)=QFileDialog.getOpenFileName(
    			self,
    			"Choisissez votre fichier",
    			".",
    			"Fichier csv (*.csv)",
    		)
    		if not fic: return
     
    		self.__affich.load(fic)
    	# slotOpenFile()
     
    	# Le slot "à propos de Qt"
            @pyqtSlot()
    	def slotAboutQt(self):
    		# Fenêtre "A propos de Qt"
    		QMessageBox.aboutQt(
    			self.centralWidget(),
    			title="{0}: à propos de Qt...".format(sys.argv[0]),
    		)
    	# slotAboutQt()
     
    	# Appel de l'"A propos"
            @pyqtSlot()
    	def slotAboutPgm(self):
    		# La fenêtre qui servira à stocker tout ce qu'on a à raconter
    		wid=QMessageBox(
    			QMessageBox.Information,
    			"{0} (à propos...)".format(sys.argv[0]),
    			"<h1 align='center'>A propos de <i>{0}</i></h1>".format(sys.argv[0])
    			+ "<center>"
    			+ "<font size='+2'><b>Exemple de lecture fichier CSV</b></font><br>"
    			+ "</center><br>"
    			+ "<center>{0}</center>".format(
    				"".join(
    					"{0}<br>".format(x) for x in (
    						"Python version {0}".format(sys.version),
    						"Qt version {0}".format(QT_VERSION_STR),
    						"PyQt version {0}".format(PYQT_VERSION_STR),
    					)
    				)
    			),
    			QMessageBox.Ok,
    			parent=self.centralWidget(),
    		)
     
    		# La fenêtre sera détruite à sa fermeture
    		wid.setAttribute(Qt.WA_DeleteOnClose)
     
    		# Affichage de la fenêtre en modal (ça désactive les autres fenêtres)
    		wid.open()
    	# slotAboutPgm()
    # class myMainWindow
     
    # L'objet pour créer mon menu
    class myMenu(QMenuBar):
    	# Constructeur
    	def __init__(self, ihm, *args, **kwargs):
    		# Récupération environnement ihm
    		self.__ihm=dict(ihm)
    		self.__ihm["parent"]=ihm["self"]
    		self.__ihm["self"]=self
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le menu sera détruit à sa fermeture
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		# Création des menus
    		for f in (
    			self.__application,
    			self.__help,
    		): self.addMenu(f())
    	# __init__()
     
    	# Le menu "application"
    	def __application(self):
    		m=QMenu("Application", parent=self)
    		m.addAction("Fichier", self.__ihm["mainWid"].slotOpenFile)
    		m.addAction("Quitter", qApp.closeAllWindows)
    		return m
    	# __application()
     
    	# Le menu "help"
    	def __help(self):
    		m=QMenu("?", parent=self)
    		m.addAction("A propos de %s" % sys.argv[0], self.__ihm["mainWid"].slotAboutPgm)
    		m.addAction("A propos de Qt", self.__ihm["mainWid"].slotAboutQt)
    		return m
    	# __help()
    # class myMenu
     
    # L'objet pour gérer l'affichage du CSV
    class myCSV(QWidget):
    	# Constructeur
    	def __init__(self, ihm, *args, **kwargs):
    		# Récupération environnement ihm
    		self.__ihm=dict(ihm)
    		self.__ihm["parent"]=ihm["self"]
    		self.__ihm["self"]=self
    		self.__ihm["fic"]=None
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WA_DeleteOnClose)
     
    		# Le titre
    		self.__titre=QLabel(parent=self)
    		self.__titre.setWordWrap(True)
     
    		# La zone d'affichage texte (non modifiable)
    		self.__data=QTableWidget(parent=self)
     
    		# L'espace de rangement principal
    		mainLayout=QVBoxLayout(self)
    		mainLayout.setContentsMargins(0, 0, 0, 0)
    		mainLayout.setSpacing(5)
    		mainLayout.addWidget(self.__titre, stretch=0)
    		mainLayout.addWidget(self.__data, stretch=1)
    	# __init__()
     
    	# Chargement csv
    	def load(self, fic):
    		self.__ihm["fic"]=fic
    		with open(fic, "r") as fp:
    			self.__titre.setText(fic)
    			dialect=csv.Sniffer().sniff(fp.read())
    			fp.seek(0)
    			rdr=csv.reader(fp, dialect, strict=True)
     
    			# Initialisation tableau
    			self.__data.clearContents()
    			lig=next(rdr)
    			self.__data.setRowCount(0)
    			self.__data.setColumnCount(len(lig))
    			for i in range(len(lig)):
    				self.__data.horizontalHeader().setSectionResizeMode(i, QHeaderView.Stretch)
     
    			# Affichage lignes
    			while True:
    				# Nouvelle ligne
    				self.__data.insertRow(rdr.line_num - 1)
     
    				# Traitement des colonnes
    				for (i, info) in enumerate(lig):
    					item=QTableWidgetItem(info)
    					item.setFlags(item.flags() & ~Qt.ItemIsEditable)
    					self.__data.setItem(rdr.line_num - 1, i, item)
    				# for
     
    				# Ligne suivante
    				try:
    					lig=next(rdr)
    				except StopIteration: break
    			# while
    		# with
    	# load()
    # class myCSV
     
    if __name__ == "__main__":
    	import os
    	# L'application principale Qt
    	sys.exit(myAppli(sys.argv[1] if len(sys.argv) > 1 else None, sys.argv).exec_())
    # if

    On nomme ce script du nom que l'on souhaite (exemple "toto.py") et soit on l'appelle en lui donnant le fichier à traiter (exemple ./toto.py xxx.csv) soit on l'appelle sans argument (exemple ./toto.py). Dans ce dernier cas il commence par ouvrir une fenêtre permettant de choisir le CSV à traiter (fenêtre pouvant aussi être demandée ensuite via le menu).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre chevronné Avatar de pyloupylou
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 438
    Par défaut
    Merci pour vos réponses et d'avoir pris le temps de regarder mes balbutiements.... je vous prie d'accepter mes excuses car en effet j'avais extrait à l'arrache le module de mon application pour le soumettre, et sans le tester préalablement.
    Vos reproches sont donc fondés

    @Sve@r:
    Je vais étudier ton code, et tes liens, le souci quand on débute avec un langage c'est de trouver les bons tutos

    @wiztricks:
    Le code fonctionne même si une fois le fichier choisi, il faut aller chercher la fenêtre dans la barre de taches
    Merci si tu peux y jeter encore un coup d'oeil


    Dans tous les cas encore merci pour votre réactivité


    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
     
    import csv
    import tkinter as tk
    from tkinter import ttk
    from tkinter.messagebox import showinfo
    from tkinter import filedialog
     
    file_csv = filedialog.askopenfilename(title="Ouvrir le fichier CSV",
                                          filetypes=[('fichier de configuration', '.csv'), ('all files', '.*')],
                                          multiple=False)
    # rien de choisi --> sortie
    if not file_csv:
        quit
     
    ffile = open(file_csv)
    csvreader = csv.reader(ffile, delimiter=";")
    header = next(csvreader)
     
    columns=header
    rows = []
     
    root1 = tk.Tk()
    root1.geometry("500x400")
    root1.title(file_csv)
     
    # define columns
    #columns = ('first_name', 'last_name', 'email')
     
    treev = ttk.Treeview(root1, columns=columns, show='headings')
    vsb = ttk.Scrollbar(root1, orient="vertical", command=treev.yview)
    vsb.place(relx=0.978, rely=0.175, relheight=0.713, relwidth=0.020)
     
    hsb = ttk.Scrollbar(root1, orient="horizontal", command=treev.xview)
    hsb.place(relx=0.014, rely=0.875, relheight=0.020, relwidth=0.965)
     
    treev.configure(xscrollcommand=hsb.set,yscrollcommand=vsb.set )
     
    # define headings
    for i in columns:
        treev.heading(i, text=i)
        treev.column(i, width=100, minwidth=50,stretch=0)
    for row in csvreader:
        rows.append(row)
    ffile.close()
     
    for contact in rows:
        treev.insert('', tk.END, values=contact)
     
    treev.grid(row=0, column=0, sticky='nsew')
     
    # run the app
    root1.mainloop()

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 716
    Par défaut
    Salut,

    Citation Envoyé par pyloupylou Voir le message
    Merci si tu peux y jeter encore un coup d'oeil
    J'y ai jeté un œil et il y a 2 soucis:
    • la création de 2 fenêtres principales à cause de l'appel à askopenfilename avant l'instanciation de Tk()
    • l'utilisation de .place au lieu de .grid

    Pour le problème initial "ajuster le treeview dans ma fenêtre que je souhaite dimensionnables", je ne sais pas trop ce que vous entendez par là.

    A priori, lorsqu'on change les dimensions de la fenêtre, on a envie que le widget (Treeview ou autre) occupe (ou pas) toute la place disponible (ce qui se fait en disant à .grid de donner cette place à certaines colonnes/lignes et qui mérite d'ouvrir un tuto sur grid - parce que c'est compliqué)... mais ça n'a rien avoir avec la "scrollabilité".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    [*]la création de 2 fenêtres principales à cause de l'appel à askopenfilename avant l'instanciation de Tk()
    Ah, je me demandais d'où pouvait bien provenir cette fenêtre. Merci

    Citation Envoyé par pyloupylou Voir le message
    Merci si tu peux y jeter encore un coup d'oeil
    Avec les infos de wiztricks (et en prenant aussi en considération la judicieuse remarque de fred1599) j'ai pu "un peu" avancer (style un aveugle qui en guide un autre le long d'une falaise).

    Voici ce que j'ai pondu
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import csv
    import tkinter as tk
    from tkinter import ttk
    from tkinter import filedialog
     
    root = tk.Tk()
    root.geometry("500x400")
    root.protocol("WM_DELETE_WINDOW", root.destroy)
     
    file_csv = filedialog.askopenfilename(
    	title="Ouvrir le fichier CSV",
    	filetypes=(
    		('fichier de configuration', '.csv'),
    		('all files', '.*'),
    	),
    	multiple=False,
    )
    # rien de choisi --> sortie
    if not file_csv:
    	root.destroy()
    	quit()
     
    root.title(file_csv)
     
    ffile = open(file_csv)
    csvreader = csv.reader(ffile, csv.Sniffer().sniff(ffile.read()))
    ffile.seek(0)
     
    # define columns
    header = next(csvreader)
    treev = ttk.Treeview(root, columns=header, show='headings')
    treev.pack(side=tk.TOP, fill=tk.BOTH)
     
    vsb = tk.Scrollbar(root, orient="vertical", command=treev.yview)
    vsb.pack(side=tk.RIGHT, fill=tk.Y)
    treev.configure(yscrollcommand=vsb.set)
     
    hsb = tk.Scrollbar(root, orient="horizontal", command=treev.xview)
    hsb.pack(fill=tk.X)
    treev.configure(xscrollcommand=hsb.set)
     
    # define headings
    for i in header:
    	treev.heading(i, text=i)
    	treev.column(i, width=100, minwidth=50,stretch=0)
    for row in csvreader:
    	treev.insert('', tk.END, values=row)
    ffile.close()
     
    # run the app
    root.mainloop()

    Le résultat fonctionne... sauf que j'ai pas réussi à bien placer les scrolls (manque de connaissance sur le gestionnaire de positionnement)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Bonjour,

    Je ne comprends pas bien l'intérêt de ces deux lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    columns=header
    rows = []

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

Discussions similaires

  1. [Python 3.X] Glisser-déposer entre deux treeview tkinter
    Par vad92 dans le forum Général Python
    Réponses: 10
    Dernier message: 20/02/2022, 14h01
  2. Réponses: 2
    Dernier message: 14/02/2021, 16h20
  3. [Python 2.X] tkinter et treeview
    Par daniel-12 dans le forum Tkinter
    Réponses: 3
    Dernier message: 25/03/2019, 09h46
  4. Selection depuis une Treeview Tkinter
    Par Ismatus1 dans le forum Général Python
    Réponses: 20
    Dernier message: 07/12/2011, 14h29
  5. Creation d'un treeview avec Tkinter
    Par julientalbourdet dans le forum Tkinter
    Réponses: 1
    Dernier message: 22/08/2009, 16h18

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