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 :

Comportement de la barre de défilement (Widget Scrollbar) [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut Comportement de la barre de défilement (Widget Scrollbar)
    Bonjour,

    J'ai, dans mon programme, quelques difficultés avec le widget Scrollbar.
    J'utilise ce dernier dans trois pages différentes.

    • Dans la première, pas de problème, la barre de défilement qui est associée à un widget Text, se comporte de manière tout à fait normale.


    • Dans la deuxième page, la barre de défilement est également associée à un widget Text. Le défilement fonctionne mais la barre se comporte de manière étrange : elle rétrécit brutalement ou bien elle s'agrandit démesurément tant et si bien qu'il m'est plus facile d'utiliser les petites flèches à chaque extrémité de la barre ; ça fait pas sérieux!


    • Dans la troisème page, la barre de défilement (self.can2_defil) est associée à un widget Canvas (self.can2). Malgré toutes mes tentatives, je n'ai jamais réusi à la faire fonctionner. J'ai essayé d'utiliser l'option "scrollregion" mais ça n'a rien donné. Ma question est donc : Que dois-je rajouter dans mon code pour que cette scrollbar fasse enfin son travail?
      Voici le code pour la scrollbar associée à un widget Canvas et aussi une capture d'écran. (Je peux également envoyer le code des scrollbars associées aux widgets Text.)

      Merci d'avance pour votre aide et bonne journée.

      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
      for self.can in self.main_frame.winfo_children():
      			self.can.destroy()
      		for child in self.tabs.winfo_children() :
      			if child.winfo_class() == 'Button' :
      				child.destroy()
      		self.can = Canvas(self.main_frame, bg='white', bd = 0, highlightthickness=0)		
      		self.can.grid(row=0, pady = 20)
      		onglets = LabelFrame(self.can)	
      		onglets.grid(padx= 450, row = 0, sticky ='w')
      		self.import_picture=Button(self.tabs,image = self.photos[18], bd = 2, bg = 'green', highlightthickness = 1, command=lambda:self.importer(import_photos))
      		self.import_picture.grid(row = 1, column = 10, padx=1, pady=1)		
      		self.can2_defil = Scrollbar(self.main_window, bg = self.color[1], relief='ridge', width=18, orient='vertical', troughcolor = 'white', activebackground = self.color[1])
      		self.can2_defil.grid(row=0,column=1, rowspan = 2, sticky='ns')
      		self.can2 = Text(self.can, height = round(self.h*3), width = round(self.w*5), bg='white', bd = 0, highlightthickness=0, padx=self.w, pady=self.h, yscrollcommand=self.can2_defil.set)	
      		self.can2.grid(row=0, column=0, sticky='w')
      		self.can2_defil.config(command=self.can2.yview)		
      		self.fichier = open(import_photos, 'r')
      		self.inserer_photos = self.fichier.readlines()
      		a = 0 # Variable de positionnement de la photo dans la ligne
      		b = 1 # Variable de positionnement de la photo dans la colonne
      		c = 0
      		for i in range (0, len(self.inserer_photos)) :
      			if a % 4 == 0 :
      				b += 1
      				a = 0
      			self.chemins.append(self.inserer_photos[i])
      			self.image = PIL.Image.open(self.inserer_photos[i].strip())
      			self.image2 = PIL.Image.open(self.inserer_photos[i].strip())
      			self.photo = Boutons_photos(self.main_window, self.main_frame, self.tabs, self.can2, self.image, self.image2, a, b, c, self.color, self.photos, import_photos, self.chemins) # Création des objets boutons-photos		
      			c+=1	# Variable d'indexation des photos
      			self.photo.creation_bouton() #Appel de la méthode de création des boutons-photos
      			a += 1


    Nom : capture scrollbar.png
Affichages : 359
Taille : 1,46 Mo

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Certes mais sans un code minimal qui permette de reproduire le problème que vous constatez, pas grand monde pourra vous aider.
    Normalement, pour réaliser une "barre de défilement (qui est) associée à un widget Text", vous créez un widget Frame, vous y placez dedans Text et Scroolbar en row x column = (0, 0) et (0, 1) respectivement sans avoir oublié frame.grid_rowconfigure(0, weight=1), frame.grid_columnconfigure(0, weight=1).
    Cela est au point, si vous devez créer beaucoup d'objets de ce type, il y a lieu de fabriquer une classe héritant de tk.Frame qui emballe le tout.

    Le but étant de faire fonctionner son interface par petit bout qu'on pourra tester avant de les utiliser (et éviter de redécouvrir la roue chaque fois que vous devrez construire le même assemblage).

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

  3. #3
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Certes mais sans un code minimal qui permette de reproduire le problème que vous constatez, pas grand monde pourra vous aider.
    - W
    Ci-dessous, le code complet du module "photothèque".

    Sur la capture d'écran que j'ai envoyée avec mon premier message, chaque image est en fait un bouton accompagné d'un autre petit bouton (la croix noire en haut à droite) qui permet de le détruire. Les deux boutons sont dans un widget Canvas (self.can3), ce qui veut dire qu'à chaque image correspond un self.can3.

    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
    #!/usr/bin/python3
    # -*- coding: utf8 -*-
     
    from tkinter import* # Importation du module tkinter
    import PIL.Image
    import PIL.ImageTk	# Module PIL (traitement des images importées)
    from module_globs import Globales
    import tkinter.messagebox
    import tkinter.filedialog
     
     
    class Plan_potager(object) :
    	"Classe instanciant la page 'Photothèque'"
     
    	def __init__(self, main_window, main_frame, tabs, color, photos):
    		"Méthode constructeur"
    		self.main_window = main_window
    		self.main_frame = main_frame
    		self.tabs  = tabs
    		self.color = color # Correspond à la color des onglets et de l'application choisie par l'utilisateur.
    		self.photos = photos
    		self.boutons_photos = []
    		self.chemins = []
    		self.size = Globales(self.main_window)
    		self.h = round(self.size.height())
    		self.w = round(self.size.width())
     
    	def serre(self, import_photos):
    		"Méthode qui affiche les photos de la serre sélectionnée"
    		self.boutons_photos = []
    		self.chemins = []
    		for self.can in self.main_frame.winfo_children():
    			self.can.destroy()
    		for child in self.tabs.winfo_children() :
    			if child.winfo_class() == 'Button' :
    				child.destroy()
     
    		self.can = Canvas(self.main_frame, bg='white', bd = 0, highlightthickness=0)		
    		self.can.grid(row=0, padx = 100)
    		self.pictures_defil = Scrollbar(self.main_window, bg = self.color[1], relief='ridge', width=18, orient='vertical', troughcolor = 'white', activebackground = self.color[1])
    		self.pictures_defil.grid(row=0,column=1, rowspan = 2, sticky='ns')
    		self.pictures = Text(self.can, height = round(self.h*3), width = round(self.w*5), bg='white', bd = 0, highlightthickness = 0)	
    		self.pictures.grid(row=0, column=0, padx=2, pady=2)
    		self.pictures.config(yscrollcommand=self.pictures_defil.set)
    		self.pictures_defil.config(command=self.pictures.yview)	
     
    		self.import_picture=Button(self.tabs,image = self.photos[18], bd = 2, bg = 'green', highlightthickness = 1, command=lambda:self.importer(import_photos))
    		self.import_picture.grid(row = 1, column = 10, padx=1, pady=1)		
     
    		self.fichier = open(import_photos, 'r')
    		self.inserer_photos = self.fichier.readlines()
    		a = 0 # Variable de positionnement de la photo dans la ligne
    		b = 1 # Variable de positionnement de la photo dans la colonne
    		c = 0
    		for i in range (0, len(self.inserer_photos)) :
    			if a % 4 == 0 :
    				b += 1
    				a = 0
    			self.chemins.append(self.inserer_photos[i])
    			self.image = PIL.Image.open(self.inserer_photos[i].strip())
    			self.image2 = PIL.Image.open(self.inserer_photos[i].strip())
    			self.photo = Boutons_photos(self.main_window, self.main_frame, self.tabs, self.pictures, self.image, self.image2, a, b, c, self.color, self.photos, import_photos, self.chemins) # Création des objets boutons-photos		
    			c+=1	# Variable d'indexation des photos
    			self.photo.creation_bouton() #Appel de la méthode de création des boutons-photos
    			a += 1
     
    	def importer(self, import_photos):
    		"Méthode permettant d'importer des photos"
    		self.chemin = tkinter.filedialog.askopenfilename(title="Importer une image",filetypes=[('png files','.png'),('all files','.*')])
    		self.image = PIL.Image.open(self.chemin)	
    		self.photo = PIL.ImageTk.PhotoImage(self.image)
    		self.fichier = open(import_photos, 'a')
    		self.fichier.write(self.chemin + '\n')
    		self.fichier.close()
    		self.serre(import_photos) # Appel de la méthode serre après avoir chargé la nouvelle photo
     
    class Boutons_photos(Plan_potager) :
    	"Sous-classe instanciant les 'boutons-photos' et les photos en taille originale"
    	def __init__(self, main_window, main_frame, tabs, pictures, image, image2, a, b, c, color, photos, import_photos, chemins) :
    		"Méthode constructeur"
    		Plan_potager.__init__(self, main_window, main_frame, tabs, color, photos)
    		self.pictures = pictures
    		self.image = image	
    		self.image2 = image2
    		self.a = a
    		self.b = b
    		self.c = c
    		self.import_photos = import_photos
    		self.chemins = chemins
    		self.dico = {}
     
    	def creation_bouton(self) :
    		"Méthode de création des 'boutons-photos'"		
    		self.adresse_can3 = []
    		self.size = 256, 256
    		self.image.thumbnail(self.size)
    		self.photo = PIL.ImageTk.PhotoImage(self.image)
    		self.can3 = Canvas(self.pictures, bg='white', highlightthickness=0, bd = 0)
    		self.can3.grid(row=self.b, column = self.a, padx=4, pady=4, sticky='s')
    		self.adresse_can3.append(self.c)	# Création d'une liste de deux éléments avec self.c pour l'indexation et self.can3(pour la photo et le bouton de suppression)	
    		self.adresse_can3.append(self.can3)
    		self.mini_photo = Button(self.can3, bg='white', bd=0, image=self.photo, activebackground='green', cursor='hand2', command=self.photo_agrandie)
    		self.mini_photo.grid(row=0, column = 0, sticky='s')
    		self.cross = Button(self.can3, image = self.photos[28], highlightthickness = 0, bd = 0 , cursor='hand2', command = self.supprimer)
    		self.cross.grid(row=0, column = 0, sticky = 'ne')	
     
    	def photo_agrandie(self) :
    		"Méthode permettant d'agrandir les photos"
    		self.grande_photo = Toplevel(name='selected')
    		self.photo2 = PIL.ImageTk.PhotoImage(self.image2)
    		self.label_photo = Label(self.grande_photo, image = self.photo2)
    		self.label_photo.grid()
     
    	def supprimer(self) :
    		"Méthode permettant de supprimer des photos"
    		self.oui_non = tkinter.messagebox.askyesnocancel('supprimer la photo?', 'Souhaitez-vous vraiment supprimer cette photo?')
    		if self.oui_non == False or self.oui_non == None :						
    			self.serre(self.import_photos)
    		elif self.oui_non == True :
    			self.d = 0 # Variable d'indexation 
    			self.list_can3 = []	
    			self.picture_path = []
    			for can3 in self.pictures.winfo_children() :
    				if can3 != self.mini_photo and can3 != self.cross :
    					self.list_can3.append(self.d)
    					self.d += 1
    			for i in range(0, len(self.chemins)) :
    				self.sous_liste = []
    				self.sous_liste.append(self.list_can3[i]) # L'index et le chemin de chaque photo sont placés dans la sous-liste elle-même placée dans la liste self.picture_path.
    				self.sous_liste.append(self.chemins[i])
    				self.picture_path.append(self.sous_liste)
    			print(self.picture_path)
    			print(self.adresse_can3[0])
    			j = 0
    			while j < len(self.picture_path):
    				if  self.adresse_can3[0] == self.picture_path[j][0] : # On compare l'indice de la photo à supprimer avec les indices de la liste
    					self.picture_path.remove(self.picture_path[j])		# Si il y a concordance, on supprime l'indice et le chemin de la liste
    				j+=1	
    			self.can3.destroy() # Destruction de la photo
    			self.fichier = open(self.import_photos, 'w')
    			for k in range(0, len(self.picture_path)):		
    				self.fichier.write(self.picture_path[k][1]) #Réécriture du fichier sans le chemin précédemment supprimé.
    			self.fichier.close()
    			self.serre(self.import_photos)
    Et voici le code du module cahier-journal dont la barre de défilement fonctionne très bien (def tout_afficher(self)) :

    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
    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
    #!/usr/bin/python3
    # -*- coding: utf8 -*-
     
    from tkinter import* # Importation du module tkinter
    from os import chdir		# Importation du module OS pour effectuer le changement de répertoire
    import os, os.path	
    from PIL import Image, ImageTk	# Module PIL (traitement des images importées)
    import tkinter.messagebox
    from module_globs import Globales
     
    #---------------------------------------------------------------------------------
     
    class Cahiers(object) :
    	"Classe instanciant la page cahier-journal 2016"
    	def __init__(self, main_window, main_frame, tabs, photos, color):
    		"Méthode constructeur"
    		self.main_window = main_window
    		self.main_frame = main_frame
    		self.tabs = tabs
    		self.photos = photos
    		self.color = color
    		self.size = Globales(self.main_window)
    		self.h = round(self.size.height()) 	# height coefficient
    		self.w = round(self.size.width())	# width coefficient
    		self.editeur_defil = None
     
    #---------------------------------------------------------------------------------
     
    	def cahier_2016 (self) :
    		"Page d'accueil de l'onglet"
    		for child in self.main_window.winfo_children() :
    			if child != self.main_frame and child != self.tabs :
    				child.destroy()
    		for self.can in self.main_frame.winfo_children() :
    			self.can.destroy()
    		for child in self.tabs.winfo_children() :
    			if child.winfo_class() == 'Button' or child.winfo_class() == 'Labelframe' :
    				child.destroy()
    		self.nouv_entree = Button(self.tabs, image = self.photos[17], bg='green', bd=2, command = self.nouvelle_entree)
    		self.nouv_entree.grid(row=1, column = 7,sticky='w')
    		self.enregistre = Button(self.tabs, image = self.photos[16], bg='green',bd=2, command = self.enregistrer)
    		self.enregistre.grid(row=1, column = 8)
    		self.accueil = LabelFrame(self.main_frame, text='Mon cahier de jardin', labelanchor='n', font='Times 40 italic', bg='white', fg='black', relief='ridge', bd=3, padx=20, pady=20)
    		self.accueil.grid(row = 1, padx = self.h*40, pady = self.h*6)
    		self.titre = Button(self.accueil, image = self.photos[4], anchor='center', bg = self.color[1], relief = 'ridge', activebackground = 'green', cursor='hand2', bd = 7, command=self.tout_afficher)
    		self.titre.grid()
     
    #---------------------------------------------------------------------------------
     
    	def nouvelle_entree(self) :
    		"Méthode qui ouvre une nouvelle entrée"
    		for child in self.main_window.winfo_children() :
    			if child != self.main_frame and child != self.tabs :
    				child.destroy()
    		for self.can in self.main_frame.winfo_children() :
    			self.can.destroy()
    		for child in self.tabs.winfo_children() :
    			if child.winfo_class() == 'Button' or child.winfo_class() == 'Labelframe':
    				child.destroy()
    		self.can = Frame(self.main_frame, height=self.h*100, width=self.w*100, bg='white', highlightthickness = 0, highlightcolor='white', relief='flat')
    		self.can.grid(row=1, padx = 50, pady = 25)
    		self.enregistre = Button(self.tabs,image = self.photos[16], bg='green',bd=2, command = self.enregistrer)
    		self.enregistre.grid(row = 1, column = 8, padx=1, pady=1)
    		self.tout_affiche = Button(self.tabs,image = self.photos[19], bg='green',bd=2, command = self.tout_afficher)
    		self.tout_affiche.grid(row=1, column = 12, padx=1, pady=1)
    		for self.edit in self.can.winfo_children():
    				self.edit.destroy()	
    		self.edit = Text(self.can, height=7, width=int(round(self.h*17.5)), bg='white', fg = self.color[1], padx=10, pady=10, highlightthickness=1, wrap='word', border=1, highlightbackground =self.color[1])
    		self.edit.grid(row = 1, column = 0)
    		self.edit.insert('end', '- N° :\n- Date :\n- Espèce :\n- Objet :')  
    		self.edit.tag_add('corps', '1.0', 'end')
    		self.edit.tag_config('corps', foreground='black', justify='left', underline = 0, font='Times 14 bold')
    		self.enregistre.config(state='normal')
     
    #---------------------------------------------------------------------------------
     
    	def enregistrer(self) :
    		"Méthode enregistrant les entrées"
    		for self.edit in self.editeur.winfo_children():
    			recup  = self.edit.get(1.0, 'end')
    			recup2 = recup.split('\n')
    			for ligne in recup2 :
    				if ligne[0:1] == '-':
    					self.fichier = open('entrees', 'a')
    					self.fichier.write(ligne + '\n')
    					self.fichier.close()
    		self.tout_afficher()
     
    #---------------------------------------------------------------------------------
     
    	def tout_afficher(self) :
    		"Méthode affichant l'historique des entrées"
    		for self.can in self.main_frame.winfo_children() :
    			self.can.destroy()
    		for child in self.tabs.winfo_children() :
    			if child.winfo_class() == 'Button' or child.winfo_class() == 'Labelframe' :
    				child.destroy()
    		self.can = Frame(self.main_frame, height=self.h*100, width=self.w*100, bg='white', bd=0, highlightthickness = 0, highlightcolor='white', relief='flat')
    		self.can.grid(row=1, padx = 50, pady = 25)
    		self.editeur_defil = Scrollbar(self.main_window, bg = self.color[1],relief='flat', width=18, troughcolor = 'white', activebackground = self.color[1])
    		self.editeur_defil.grid(row=0,column=1, rowspan=2, sticky='ns')
    		self.editeur = Text(self.can, height = self.h*3, width = int(round(self.h*11.5)), bg=self.color[1], font='Times 16', padx=20, pady=10, highlightthickness=0, wrap='word', yscrollcommand=self.editeur_defil.set)
    		self.editeur.grid(row=1, column=0, padx=5, pady=5)
    		self.editeur_defil.config(command=self.editeur.yview)	
    		self.editeur.tag_add('corps', '3.0', 'end')
    		self.editeur.tag_config('corps', foreground='black', justify='left', underline = 0, font='Times 14 bold')
    		for self.edit in self.editeur.winfo_children():
    			self.edit.destroy()
    		self.detruire = Button(self.tabs, image=self.photos[13], bg='green', bd=2, command = self.destruction)
    		self.detruire.grid(row = 1, column = 9, padx=1, pady=1)
    		self.nouv_entree = Button(self.tabs, image = self.photos[17], bg='green',bd=2, command = self.nouvelle_entree)
    		self.nouv_entree.grid(row = 1, column = 7, padx=1, pady=1)
    		self.modif = Button(self.tabs, image = self.photos[15], bg='green', bd=2, command = self.modifier)
    		self.modif.grid(row = 1, column = 11, padx=1, pady=1)
    		self.tout_affiche = Button(self.tabs,image = self.photos[19], bg='green',bd=2, command = self.tout_afficher)
    		self.tout_affiche.grid(row=1, column = 12, padx=1, pady=1)
    		self.searchframe = LabelFrame(self.tabs, bg='white')
    		self.searchframe.grid(row=1, column=14, padx=1, pady=1)
    		self.recherche = Button(self.searchframe, image=self.photos[14], bg='green', bd=2, command=self.rechercher)
    		self.recherche.grid(row=0, column=0 , padx=1, pady=1)
    		self.label = Label(self.tabs, text='Rechercher', fg='white', bg = self.color[1])
    		self.label.grid(row = 0, column = 14, sticky = 'ew')
    		self.entree_recherche = Entry(self.searchframe, width = 15, font = 'Times 16', bd = 2, fg = self.color[1])
    		self.entree_recherche.grid(row=0, column=1, padx=1, pady=1)
     
    		self.fichier = open('entrees', 'r')
    		self.inserer_fichier = open('cahier_journal', 'w')
    		self.inserer_fichier = self.fichier.readlines()
    		self.fichier.close()
    		for i in range (len(self.inserer_fichier), 0, -4):
    			self.editeur.delete(4.0, 'end')	
    			self.edit = Text(self.editeur, height = 7, width = int(round(self.h*17.5)), bg = 'white', fg = self.color[1], padx = 10, pady = 10, highlightthickness = 1, wrap='word', highlightbackground=self.color[1])
    			self.editeur.window_create('end', window=self.edit, padx = 1, pady = 1)		
    			self.edit.insert('end', str(self.inserer_fichier[i-4])+'\n' + str(self.inserer_fichier[i-3])+'\n' + str(self.inserer_fichier[i-2])+'\n' + str(self.inserer_fichier[i-1])+'\n')
     
    #---------------------------------------------------------------------------------
     
    	def destruction(self):
    		"Méthode de destruction des fenêtres embarquées dans l'éditeur"
    		a_detruire = self.editeur.focus_get()
    		if str(a_detruire) == "." :
    			erreur = tkinter.messagebox.showerror('Sélectionner une fenêtre', 'Veuillez sélectionner une fenêtre.')
    		else :
    			prevenir = tkinter.messagebox.askokcancel('Supprimer la fenêtre?', 'Voulez-vous vraiment supprimer cette fenêtre?')
    			if prevenir == True :
    				a_detruire.destroy()
    			self.fichier = open('entrees', 'w')
    			self.fichier.close()
    			for self.edit in self.editeur.winfo_children():
    				recup  = self.edit.get(1.0, 'end')
    				self.fichier = open('entrees', 'a')
    				self.fichier.write(recup)
    				self.fichier.close()
    			self.fichier = open('entrees', 'r')
    			self.inserer_fichier = open('cahier_journal','w')
    			self.inserer_fichier = self.fichier.readlines()
    			self.fichier.close()
    			self.fichier = open('entrees', 'w')
    			self.fichier.close()
    			for ligne in self.inserer_fichier :
    				if ligne[0] == '-':
    					self.fichier = open('entrees', 'a')
    					self.fichier.write(ligne)
    					self.fichier.close()
    			self.fichier = open('entrees', 'r')
    			self.inserer_fichier = open('cahier_journal','w')
    			self.inserer_fichier = self.fichier.readlines()
    			self.fichier.close()
    			self.fichier = open('entrees', 'w')
    			self.fichier.close()
    			self.fichier = open('entrees', 'a')
    			for ligne in range(len(self.inserer_fichier), 0, -4):
    				self.fichier.write(self.inserer_fichier[ligne-4]) 
    				self.fichier.write(self.inserer_fichier[ligne-3]) 
    				self.fichier.write(self.inserer_fichier[ligne-2])
    				self.fichier.write(self.inserer_fichier[ligne-1])
    			self.fichier.close()
     
    #---------------------------------------------------------------------------------
     
    	def modifier(self):
    		"Sous-fonction de modification des entrées enregistrées"
    		a_modifier = self.editeur.focus_get()
    		if str(a_modifier) == "." :
    			erreur = tkinter.messagebox.showerror('Sélectionner une fenêtre', 'Veuillez sélectionner une fenêtre.')		
    		else :
    			modifier = tkinter.messagebox.askokcancel('modifier la fenêtre?', 'Voulez-vous vraiment modifier cette fenêtre?')
    			a_modifier2 = a_modifier.get(1.0, 1.15)
    			if modifier == True :
    				self.enregistre = Button(self.tabs, image = self.photos[16], bg='green',bd=2, command = self.enregistrer)
    				self.enregistre.grid(row=1, column = 8)
    				self.detruire.config(state='disabled')
    				self.recherche.config(state='disabled')
    				self.nouv_entree.config(state='disabled')
    				self.modif.config(state='disabled')
    				for self.edit in self.editeur.winfo_children():
    					if self.edit != a_modifier :
    						self.edit.destroy()
    				self.fichier = open('entrees', 'r')
    				self.inserer_fichier = open('cahier_journal','w')
    				self.inserer_fichier = self.fichier.readlines()
    				self.fichier.close()
    				self.fichier = open('entrees', 'w')
    				for ligne in range(0, len(self.inserer_fichier), 4):
    					if not self.inserer_fichier[ligne].startswith(a_modifier2):
    						self.fichier.write(self.inserer_fichier[ligne])
    						self.fichier.write(self.inserer_fichier[ligne+1]) 
    						self.fichier.write(self.inserer_fichier[ligne+2])
    						self.fichier.write(self.inserer_fichier[ligne+3])
    				self.fichier.close()
     
    #---------------------------------------------------------------------------------
     
    	def rechercher(self) : 
    		self.search = self.entree_recherche.get()
    		self.search = self.search.lower()
    		for edit in self.editeur.winfo_children() :
    			self.note = edit.get(1.0, 'end')
    			self.note = self.note.lower()
    			if self.search not in self.note :
    				edit.destroy()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Je vous demande un code minimal qui reproduise votre problème et vous postez 400 lignes de code?
    C'est suffisant pour constater que vous n'avez pas utilisé les grid_{row|colmumn}configure indiqués dans mon précédent post.
    On vous indique ici comment utiliser cela.

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

  5. #5
    Membre averti Avatar de Kaa'dem-2072
    Homme Profil pro
    Biogärtner
    Inscrit en
    Décembre 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Biogärtner
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2015
    Messages : 24
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    C'est suffisant pour constater que vous n'avez pas utilisé les grid_{row|colmumn}configure indiqués dans mon précédent post.
    - W
    Bonjour,

    J'ai essayé de les inclure dans mon code mais malheureusement ça n'a rien donné. Donc, je les ai supprimés. Le lien vers http://effbot.org/tkinterbook/, je l'avais déjà consulté. En fait, je viens de trouver l'erreur et maintenant, ça fonctionne. Les boutons-photos (=self.can3 - ligne 99) que j'avais créés étaient inclus dans le widget Text sans la méthode Text.window_create.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.can3.grid(row=self.b, column = self.a, padx=4, pady=4, sticky='s')
    J'ai supprimé cette ligne et je l'ai remplacée par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.pictures.window_create('end', window = self.can3, padx = 5, pady = 5)
    Maintenant, ça roule!

    Pour ce qui est des quatre cents lignes de code que j'ai envoyés, je n'ai pas fait ça dans un esprit de négligence en me disant "qu'il se débrouille avec!". Dans mon premier message, vous m'aviez dit de fournir plus de code. Je me suis donc dit qu'il était nécessaire d'envoyer tout le module. Je n'ai sans doute pas bien saisi votre notion de code minimal. Mais croyez bien que ce n'est pas mon but de faire perdre du temps à quelqu'un qui m'apporte régulièrement son aide.

    Il me reste toutefois à corriger une scrollbar capricieuse dans le module "légumes". Elle fonctionne mais elle se comporte de manière bizarre. Elle occupe tout le trough et puis soudain elle rétrécit brutalement. En fait, seules les petites flèches du haut et du bas fonctionnent normalement. Avec les infos que vous m'avez fournies, Je vais essayer de voir ce qui cloche et si je ne trouve pas, je remettrai la discussion en "non résolu"

    Bonne journée à vous.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par Kaa'dem-2072 Voir le message
    Pour ce qui est des quatre cents lignes de code que j'ai envoyés, je n'ai pas fait ça dans un esprit de négligence en me disant "qu'il se débrouille avec!". Dans mon premier message, vous m'aviez dit de fournir plus de code. Je me suis donc dit qu'il était nécessaire d'envoyer tout le module. Je n'ai sans doute pas bien saisi votre notion de code minimal. Mais croyez bien que ce n'est pas mon but de faire perdre du temps à quelqu'un qui m'apporte régulièrement son aide.
    La notion de code minimal vient du fait que votre problème doit pouvoir se résumer à la composition des quelques widgets qui sont concernés.
    Normalement, en essayant de réduire le code à cela, vous avez de bonnes chances de trouver l'erreur par vous même.
    Sinon vous avez un (petit) code indépendant de votre application que vous pouvez facilement commenter et poster.

    Si vous postez un code touffu où il va falloir faire ce travail de décorticage soi-même, on a de fortes chances patauger à essayer de comprendre ce que vous voulez faire et de passer à côté du problème que vous avez. Autrement dit passer beaucoup de temps sans pour autant pouvoir vous aider... découragera beaucoup d'intervenants qui pourraient vous aider si c'était plus simple de "voir" de quoi vous parlez avec un code plus concis qu'on pourra lancer sur sa bécane pour voir. In fine, c'est vous qui restez dans la panade... ce qui est dommage.

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

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/05/2009, 14h23
  2. Réponses: 5
    Dernier message: 02/07/2008, 13h26
  3. Erreur "La fenêtre ne comporte pas de barres de défilement"
    Par AlexPajon dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/10/2007, 09h35
  4. [div][scrollbar]lier les barres de défilement entre elles
    Par snoop dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 23/02/2006, 16h59
  5. Afficher les barres de défilement (scrollbar) sous FF
    Par _Mac_ dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/11/2005, 14h51

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