Bonjour à tous et à toutes,
Grand débutant Python, je me lance dans le développement de ma première application personnelle. J'ai créé pour cela une classe spéciale pour gérer sa fenêtre principale et qui est destinée à être appelée depuis le programme principal. En voici le code :
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
# Importations
from tkinter import *
import os
 
class FenetrePrincipale(Tk):
	"Classe créant la fenêtre de base de l'interface:"
	"	- une fenêtre "
	"	- un cadre logo"
	"	- un cadre pour les onglets de navigation"
	"	- un cadre pour le menu d'affichage"
	"	- un cadre pour l'affichage principal"
 
	# Constructeur
	def __init__(self):
		# Appel du constructeur de la classe parente 'Tk'
		Tk.__init__(self)						
 
		#Titre de la fenêtre
		self.title("Delphidactic 4.0")			
 
		# Récupération de la largeur et de la hauteur de l'écran dans <wscr> et <hwcr>
		wscr = self.winfo_screenwidth()			
		hscr = self.winfo_screenheight()
 
		# Rédimensionnement de la fenêtre à la taille de l'écran
		self.geometry("%dx%d+0+0" % (wscr, hscr))	
 
		#self.iconbitmap("dd_icon.ico")
 
		# Icône de la barre de tâche
		if "nt" == os.name:							
			self.wm_iconbitmap("dd_icon.ico")			# pour Windows
		else:
			self.wm_iconbitmap("@dd_icon.xbm")			# pour Linux
 
		# Définitions des cadres principaux et permanents
		# Cadre du logo
		cadrLogo = Frame(self,bg='white', height=int(hscr/16), width=int(wscr/8),bd=2, relief=FLAT)			
		cadrLogo.grid(row=1, column=1)
		can = Canvas(cadrLogo, height=int(hscr/16)-5, width=int(wscr/8)-5, bg='white',bd=-2)
		logo = PhotoImage(file='logo66.gif')
		can.create_image((int(wscr/8))/2,(int(hscr/16))/2,image=logo)
		can.image=logo
		can.pack()
 
		# Cadre de la barre de navigation
		self.cadrNavig = Frame(self,bg='grey50', bd=0, height=int(hscr/16), width=wscr-int(wscr/8), relief=FLAT)
		self.cadrNavig.grid(row=1, column=2)
 
		# Cadre du menu des affichages
		self.cadrMenAff = Frame(self,bg='grey60', bd=0, height=hscr-int(hscr/16), width=int(wscr/8), relief=FLAT)
		self.cadrMenAff.grid(row=2, column=1)
 
		# Cadre de l'affichage principal
		self.cadrPrinc = Frame(self, bd=0, height=hscr-int(hscr/16), width=wscr-int(wscr/8), relief=FLAT)
		self.cadrPrinc.grid(row=2, column=2)
		self.cadrPart2 = Frame(self.cadrPrinc,bg='white', bd=0, height=hscr-int(hscr/16), width=(wscr-int(wscr/8))/2, relief=FLAT)
		self.cadrPart1 = Frame(self.cadrPrinc,bg='light blue', bd=0, height=hscr-int(hscr/16), width=(wscr-int(wscr/8))-(wscr-int(wscr/8))/2, relief=FLAT)
		self.cadrPart1.grid(row=1,column=1)
		self.cadrPart2.grid(row=1,column=2)
 
		def getSection1(self):
			return self.cadrPart1
 
		def getSection2(self):
			return self.cadrPart2
 
		def getMenu(self):
			return self.cadrMenAff
Pour essayer cette classe, j'ai créé le petit programme test suivant pour voir si je peux provoquer l'affichage d'un Label par exemple dans l'un des Frames de la fenêtre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
# Importations
from interface import *
from tkinter import *
 
fen = FenetrePrincipale()
Label(fen.getSection1(),'Hello').pack()
 
fen.mainloop()
Quand je le lance, j'obtiens le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
AttributeError: '_tkinter.tkapp' object has no attribute 'getSection1'
Je ne comprends pas bien ce message et pourquoi il me parle d'un 'attribut' getSection1 alors qu'il s'agit d'une méthode. Je pressens que la référence du cadre dans lequel je veux afficher le Label ne passe pas sans en comprendre la raison.
Qu'est-ce que j'ai raté ? Y a-t-il un problème dans la conception générale de ce début d'appli? Est-ce par exemple une bonne idée de faire de la fenêtre principale une classe comme je l'ai fait ou serait-il préférable de la créer dans le corps principal de l'appli?