Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

nombre réponses : 25

#0 -1 »  Exposure Fusion sous linux : Enfuse et une interface graphique » Le 17/07/2009, à 21:24

Aurel07
Réponses : 6

Bonsoir a tous,

sombre ou on ne voit rien.
La solution jusqu'a présent était d'utiliser une image HDR (High Dynamic Range) et de la "tone-mapper", avec des resultats plus ou moins reussis, rarement naturel, et ce quand on arrive a bien manipuler le logiciel. Qtpfsgui et le logiciel qui permet cela.
La deuxieme solution, plus récente, est d'utiliser l'"Exposure Fusion" avec Enfuse, son representant en terre linuxienne. Enfuse ne se base pas sur une image HDR, mais choisi les zones les mieux exposées des différentes photos de départ (http://wiki.panotools.org/Enfuse pour plus de détails).
Enfuse est en ligne de commande, et est assez simple d'usage, mais possede un grand nombre d'options. Pour arranger ca, j'ai créé un petit gui en python+glade qui permet de tester les reglages d'enfuse sur des previsualisations, avec un temps de calcul d'environ 2sec. Quand le résultat est satisfaisant, il ne reste plus qu'a lancer la fusion sur les vraies images, ce qui prend plus de temps.

Le Gui en action :
mini_868460Capture_EnfuseGui1.jpg

Un exemple, les 5 images de départ, et l'image "fusionnée" en dernier :
mini_6504356en1.jpg

Voila le lien pour mon mon programme : http://gholyo.free.fr/blog/public/EnfuseGui.tar.gz. Il suffit de la décompresser, et d'executer "EnfuseGui.py". Les dépendances sont python, pygtk, glade, PIL (python Imaging Library) et enfuse bien sur.

Tout retour sera bien aprrécié, ne serait ce que pour debugger le tout, car il s'agit d'une premiere version.

#1 Re : -1 »  Exposure Fusion sous linux : Enfuse et une interface graphique » Le 20/07/2009, à 17:22

Aurel07
Réponses : 6

Oui, en effet. Le mieux, c'est d'avoir une photo en raw, de la développer avec son dérawtiseur préféré (Ufraw, Bible, ou Digital Photo Pro par wine pour les canon) avec differents paramètres d'exposition.  Typiquement, sur l'exemple de mon premier post, c'est 1 image raw, avec comme parametres d'exposition -2EV, -1EV, 0EV, 1EV et 2EV.

Cependant, il est aussi possible de l'utiliser sur du jpeg, en modifiant avec Gimp par exemple la luminosité et/ou le contraste par exemple. A partir d'une photo originale en jpeg, on cree une photo bien exposée pour les parties sombres, une pour le ciel ou les parties tres lumineuses, ... et on assemble le tout avec Enfuse. Evidemment, ca sera moins bien qu'avec une image raw (perte d'information), mais le resultat vaut quand meme le coup.

L'autre solution, c'est de prendre plusieurs photos avec différetnes expositions, sur un pied, ou en les alignant au préalable (ca doit etre possible avec Hugin).

Edit : pour plus d'infos, j'ai fait un article plus détaillé sur mon blog : http://gholyo.free.fr/index.php/post/20 … /EnfuseGui

#2 Re : -1 »  Chromium navigateur et Ubuntu » Le 04/11/2009, à 12:03

Aurel07
Réponses : 2536
playmobill a écrit :

Petit retour. Toujours content de chromium (même si j'ai l'impression qu'il s'essoufle en cours d'utilisation) mais j'avoue que l'absence de barre de recherche me gêne pas mal. Je sais qu'on peut toujours faire une recherche dans la barre d'adresse, mais on doit passer par le panneau de configuration pour changer de moteur. Or je ne cesse de jongler entre Google, Google Scholar, Wikipedia (fr et en), le dico anglais de Wordreference... Ai-je loupé une fonctionnalité à ce sujet ?

Il y'a un moyen : Dans les options, tu cliques sur "manage" pour les moteurs de recherche, et il y'a une case "keywords" pour chaque moteur de recherche que tu veux. Tu peux modifier ce keyword. Quand tu voudras chercher, par exemple sur wikipedia, tu taperas "wiki chat angora", si ton keyword est wiki. Comme tu choisis ton keyword, tu peux le mettre à une lettre donc ca reste assez pratique (et puis tu n'as pas a te servir de la souris)

Sinon, j'ai une question : Est ce qu'il est possible d'avoir la synchronisation des bookmarks sous ubuntu, et sous linux plus généralement, avec Chromium ?

#3 Re : -1 »  WebP, bonne nouvelle pour le libre » Le 02/10/2010, à 19:05

Aurel07
Réponses : 7

Après quelques essais, ce nouveau format présente un intérêt certain pour les petites images très compressées, beaucoup moins pour les grosses images (style photos en pleine résolution).

En fait, le résultat paraît bien plus "lisse", "smooth" que du jpeg (à taille égale), et les artéfacts sont beaucoup moins visibles que pour le jpeg. Par contre, pour les photos plus grandes et assez "naturelles" (as une mire quoi), les images paraissent lissées et perdent du piqué. Jpeg avec ses artéfacts donne l'illusion de conserver ce piqué.

Je peux essayer d'uploader mes essais, si certains sont intéressés...

#4 Re : -1 »  WebP, bonne nouvelle pour le libre » Le 02/10/2010, à 19:14

Aurel07
Réponses : 7

Avec l'outil que Google a mis à dispo :
http://code.google.com/intl/fr-FR/speed … nload.html

Par contre, j'ai l'impression que ça ne marche qu'avec du 64 bits, et il faut des libjpeg et libpng un peu bizarres.

#5 Re : -1 »  WikiLeaks frappe encore » Le 06/04/2010, à 18:10

Aurel07
Réponses : 35
Koshie-2.0 a écrit :

En voyant la vidéo de mathieuI, on a réellement l'impression qu'ils ont des fusils d'assauts... Surtout que lorsqu'ils croient qu'il y a un mec avec un RPG (lance roquette), le mec se poste dans un angle de mur et positionne un objet sur son épaule comme-ci il s'apprêtait à tirer.

Non, ça tiens pas une seconde. D'une part, ils sont en train de se balader peinard dans les rues en sachant qu'ils ont 2 hélicos américains qui les surveillent. Si ils avaient voulus tiré, ils se seraient au moins planqué derrière les murs.
Et puis, quand même, on ne tire pas sur quelqu'un (avec un avantage monstrueux en terme de techno, et en étant sur de tuer) quand on n'est pas sûr que le gars a une arme. Ils sont clairement trop loin pour distinguer si ce sont des armes. En l'occurrence, il semble qu'il y avait 1 AK47, et le "RPG", c'était une caméra... Y'a quand même une grosse différence entre un lance-roquette et une caméra, donc si les mecs sont pas capables de discerner entre les 2, ils tirent pas, un point c'est tout. Surtout (je me répète, mais c'est pour insister) quand les mecs ont pas une attitude suspecte alors qu'ils se savent surveillés.
Et puis le van qui vient pour emmener le blessé, là y'a aucune raison. Leur raisonnement c'est : on voit pas ce qu'ils font dans le van, donc ils sont en train de préparer une attaque. Désolé, mais ça ne tient, c'est évident qu'ils viennent chercher le mec blessé...
Ajouté à tout ça les remarques digne d'Elephant" (le film de Lars Von Trier sur le massacre de Columbine) ("Let us shoot!", "Look at those dead bastards! Nice!", ...), ça pue vraiment, et ça montre que ces mecs devraient pas être autorisés à avoir des armes dans les mains. Et que leurs chefs devraient pas les autoriser à ouvrir le feu avec si peu d'éléments et si peu de fiabilité.

#7 Re : -1 »  SVP aidez moi .. (pb) de boutons souris razer diamondback 3G » Le 03/02/2010, à 22:51

Aurel07
Réponses : 8

J'en sais pas plus que ça, je ne suis plus sous Ubuntu maintenant, et j'ai changé de souris, je pourrai pas tester.

Cependant je me rappelle que j'avais testé pas mal de config différentes, notamment changer les boutons dans le ButtonMapping (l'ordre est important bien sur). Et il faut bien mettre 9 boutons, meme si tu n'en as que 7.

Mon conseil, c'est teste plein de configs, mais apres, je peux pas t'en dire plus... désolé.

#8 Re : -1 »  SVP aidez moi .. (pb) de boutons souris razer diamondback 3G » Le 03/02/2010, à 22:51

Aurel07
Réponses : 8

J'en sais pas plus que ça, je ne suis plus sous Ubuntu maintenant, et j'ai changé de souris, je pourrai pas tester.

Cependant je me rappelle que j'avais testé pas mal de config différentes, notamment changer les boutons dans le ButtonMapping (l'ordre est important bien sur). Et il faut bien mettre 9 boutons, meme si tu n'en as que 7.

Mon conseil, c'est teste plein de configs, mais apres, je peux pas t'en dire plus... désolé.

#9 Re : -1 »  Interface Graphique et programmation [Résolu] » Le 15/10/2009, à 14:00

Aurel07
Réponses : 6

PyGTK avec Glade ou PyQT avec qt-creator.
Faut programmer dans un éditeur normal (gedit, vi, ou des IDE plus poussés), mais t'as pas besoin de compiler et la création d'interface graphique ainsi que son intégration dans le programme sont d'une facilité déconcertante !

#10 Re : -1 »  lanceur d'application dans le tableau de bord » Le 01/11/2009, à 14:27

Aurel07
Réponses : 17

Je ressort ce topic pour ceux que ça intéresse.
Etant sous Archlinux depuis quelques temps, l'applet minicommander n'est pas disponible simplement, donc j'en ai programmé un en python. Vous pouvez le trouver ici : http://gholyo.free.fr/index.php/post/20 … /RunApplet
Et en plus vous aurez un petit tuto pour programmer ce genre de choses !

Une petite image :
RunApplet.png

#11 Re : -1 »  Je cherche un lecteur audio... » Le 27/10/2009, à 20:53

Aurel07
Réponses : 56

MPD + Sonata :

-Je trouve l'icone super jolie Sonata_logo.png
-Possibilité d'enregistrer les playlists
-Recommence là où il s'était arrêté
-Interface épurée et très claire avec organisation selon les dossiers (non pas selon les tags ou autre cochonneries)
-Très léger et possibilité de fermer la fenêtre et garder uniquement l'icone dans le system tray. (même, tu peux fermer complètement sonata, et MPD continuera à jouer ta playlist. Pratique si tu te déconnectes souvent (genre débuggage de Xorg))
-etc...

http://doc.ubuntu-fr.org/mpd#les_principaux_clients pour plus d'infos

#12 Re : -1 »  [RESOLU] ipython ou pyshell » Le 15/10/2009, à 11:10

Aurel07
Réponses : 64

Bonjour tous.

Il existe de tres nombreux plugins pour gedit qui le transforment en un IDE quasi complet : completion de code, console (i)python, python outline, indentation, ...

vous pouvez les trouver ici :
http://live.gnome.org/Gedit/Plugins

#13 -1 »  [PyGTK] gtk.Entry et methode select_region [Résolu] » Le 11/10/2009, à 23:18

Aurel07
Réponses : 3

Bonsoir,

J'utilise une boite Entry, et je veux y faire une auto-completion maison dedans. Pour ca, je voudrais que lorsque la touche "Tab" est pressée, je voudrais que le terme de completion s'affiche, mais que seule la partie rajoutée par le programme soit sélectionnée.

Exemple :
je tape "ge", qui est le début de "gedit". En appuyant sur "Tab", "gedit" s'affiche, mais il est selectionné en entier par défaut, alors que je voudrais que seul "dit" soit sélectionné.

J'ai essayé d'utiliser la methode select_region, mais ca marche pas :

def on_Tab_pressed(self):
    liste_completion=self.completion()
    self.entry.set_text(liste_completion[0])  #seule la premiere completion est affichée
    self.entry.select_region(len(entry_text), -1)  #où entry_text est le texte entré au clavier avant la completion

J'ai bien sur testé avec un vrai entier (genre 2) à la place de len(entry_text), et ça ne marche pas mieux. Par contre, si je fais le select_region à un autre moment, ca marche, sauf si le texte de l'entry a été modifié juste avant.

def on_Tab_pressed(self):
    entry.set_text("coucou")
    
def on_Up_pressed(self):
    entry.select_region(2, 4)

marche (quand on appuie sur Up).

Et un truc du style :

entry.set_text("coucou")
time.sleep(1)
entry.select_region(2, 4)

ne marche pas mieux...

Est ce que quelqu'un a deja rencontré ce probleme ?
Bug de l'API GTK, ou je suis trop un noob ???

#14 Re : -1 »  [PyGTK] gtk.Entry et methode select_region [Résolu] » Le 12/10/2009, à 19:11

Aurel07
Réponses : 3

Ben je suis pas contre, mais je suis pas arrivé à la faire marcher comme je voulais.
Je veux faire un applet pour le panel de gnome en fait (comme mini-commander, qui n'existe plus), et pour ca, je voudrais que les propositions de completion puissent cycler dans l'Entry sans afficher une liste, et je n'ai pas trouver comment faire (genre j'appuie sur Tab et ca passe à la proposition suivante). Il semblerait que Entrycompletion ne fonctionne qu'avec des listes.
J'ai eu beau chercher dans la doc, je ne suis pas arrivé a trouver mon bonheur, donc je veux bien que tu m'indique la solution, si tu l'as !

#15 Re : -1 »  [PyGTK] gtk.Entry et methode select_region [Résolu] » Le 12/10/2009, à 23:46

Aurel07
Réponses : 3

Got it !!

En fait, le probleme, c'est que la touche Tab que je veux utiliser sert par défaut a tout sélectionner. Donc il faut empêcher le signal "keypress_Tab" d'aller plus loin que mon callback perso. Pour ca, il suffit de retourner True à la fin dudit callback :

def on_Tab_pressed(self):
    entry.set_text("coucou")
    entry.select_region(2, 4)
    return True

C'était pas si compliqué que ça, mais quand même, j'ai appris un truc...

#16 -1 »  [Gnuplot-py] plot 3d en coordonnées polaires » Le 08/07/2009, à 09:34

Aurel07
Réponses : 2

Bonjour a tous,

Pour mes programmes scientifiques, je commence à utiliser python, scipy et gnuplot-py, mais il me reste quelques problemes avec ce dernier.

Je fais calculer par Python des données de la forme z=f(r,theta) (donc en coordonnées polaires, avec une 3eme dimension qui est la valeur calculée). Je voudrais donc plotter ceci en 3D, a la maniere d'une surface z=f(x,y), mais gnuplot ne semble permettre de faire ca qu'en coordonnées cartesiennes.

Apres quelques essais, je suis arrivé a plotter en parametrique :

set parametric
splot r*cos(theta), r*sin(theta), z(r, theta)

mais ca ne me convient pas car j'aimerai pouvoir y ajouter de la couleur (une echelle de couleur selon l'axe z), et en parametric, ca semble impossible.

Quelqu'un sait faire ?...

#17 Re : -1 »  [Gnuplot-py] plot 3d en coordonnées polaires » Le 09/07/2009, à 20:18

Aurel07
Réponses : 2

Bon en fait, j'ai réussi, mais c'est pas tres élégant parce que je suis obligé de passer par un fichier intermédiaire. Ce fichier est organisé en plusieurs blocs à r fixé, séparé par une ligne vide. Il y a 3 colonnes, une pour r*cos(theta) (donc c'est x en cartesien), une pour y=r*sin(theta) et la derniere pour z. Donc mon fichier est constitué de size(r) blocs de 3 colonnes de longueur size(theta). Et en plottant ca en parametric, ca marche, il reconnait les surfaces d'iso-r et peux me les colorer suivant la valeur de z.

ca donne ca en python :

g('set pm3d')
g('set hidden3d')
g('set pm3d at bs')
g('set pm3d scansbackward')
g('set palette rgbformulae 33,13,10')
g('set ticslevel 1')
g.splot("'Poyntingz' with line")
raw_input('Please press return to print graph...\n')
g.hardcopy('gp_test.ps', enhanced=1, color=1)

avec tout ca, j'ai le plot 3d, avec couleur changeant selon la hauteur, et la carto en dessous (genre pcolor de matlab).

#18 -1 »  [Upgrade]Carte mère compatible C2Duo ? » Le 04/07/2009, à 21:36

Aurel07
Réponses : 2

Bonsoir a tous,

J'ai un vieux portable (5ans) avec un proc pentiom 4 qui chauffe a mort et qui du coup fait planter la machine de temps en temps. Cependant, il a un écran 17 pouces vachement bien, et je voudrais savoir si sa carte mere serait capable de prendre un processeur plus récent qui chauffe moins, genre un de la serie des "core".
J'y connais rien en carte mere, mais voici ce que j'ai pu apprendre :

Résultat de dmidecode :

# dmidecode 2.9
SMBIOS 2.31 present.
29 structures occupying 906 bytes.
Table at 0x000DC010.

Handle 0x0000, DMI type 0, 20 bytes
BIOS Information
	Vendor: PHOENIX FirstBIOS
	Version: V2.90.T05
	Release Date: 05/26/2005
	Address: 0xE4160
	Runtime Size: 114336 bytes
	ROM Size: 512 kB
	Characteristics:
		ISA is supported
		PCI is supported
		PC Card (PCMCIA) is supported
		PNP is supported
		APM is supported
		BIOS is upgradeable
		BIOS shadowing is allowed
		ESCD support is available
		ACPI is supported
		USB legacy is supported
		AGP is supported
		Smart battery is supported
		BIOS boot specification is supported

Handle 0x0001, DMI type 1, 25 bytes
System Information
	Manufacturer: Acer
	Product Name: Aspire 1800     
	Version: Null
	Serial Number: Null
	UUID: 37383433-3838-3464-6666-000XXXXXXX
	Wake-up Type: Power Switch

Handle 0x0002, DMI type 2, 8 bytes
Base Board Information
	Manufacturer: Acer            
	Product Name: Aspire 1800     
	Version: Null
	Serial Number: LXA2905XXXXXXXXXX

Handle 0x0003, DMI type 3, 21 bytes
Chassis Information
	Manufacturer: No Enclosure
	Type: Other
	Lock: Not Present
	Version: N/A
	Serial Number: None
	Asset Tag: No Asset Tag
	Boot-up State: Safe
	Power Supply State: Safe
	Thermal State: Safe
	Security Status: None
	OEM Information: 0x00000000
	Height: 52 U
	Number Of Power Cords: 18
	Contained Elements: 0

Handle 0x0004, DMI type 4, 35 bytes
Processor Information
	Socket Designation: WMT478/NWD
	Type: Central Processor
	Family: Pentium 4
	Manufacturer: Intel
	ID: 34 0F 00 00 FF FB EB XX
	Signature: Type 0, Family 15, Model 3, Stepping 4
	Flags:
		FPU (Floating-point unit on-chip)
		VME (Virtual mode extension)
		DE (Debugging extension)
		PSE (Page size extension)
		TSC (Time stamp counter)
		MSR (Model specific registers)
		PAE (Physical address extension)
		MCE (Machine check exception)
		CX8 (CMPXCHG8 instruction supported)
		APIC (On-chip APIC hardware supported)
		SEP (Fast system call)
		MTRR (Memory type range registers)
		PGE (Page global enable)
		MCA (Machine check architecture)
		CMOV (Conditional move instruction supported)
		PAT (Page attribute table)
		PSE-36 (36-bit page size extension)
		CLFSH (CLFLUSH instruction supported)
		DS (Debug store)
		ACPI (ACPI supported)
		MMX (MMX technology supported)
		FXSR (Fast floating-point save and restore)
		SSE (Streaming SIMD extensions)
		SSE2 (Streaming SIMD extensions 2)
		SS (Self-snoop)
		HTT (Hyper-threading technology)
		TM (Thermal monitor supported)
		PBE (Pending break enabled)
	Version: D0
	Voltage: 1.8 V
	External Clock: 200 MHz
	Max Speed: 1600 MHz
	Current Speed: 3200 MHz
	Status: Populated, Enabled
	Upgrade: Slot 1
	L1 Cache Handle: 0x0008
	L2 Cache Handle: 0x0009
	L3 Cache Handle: Not Provided
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Part Number: Not Specified

Handle 0x0005, DMI type 5, 20 bytes
Memory Controller Information
	Error Detecting Method: None
	Error Correcting Capabilities:
		None
	Supported Interleave: One-way Interleave
	Current Interleave: One-way Interleave
	Maximum Memory Module Size: 1024 MB
	Maximum Total Memory Size: 2048 MB
	Supported Speeds:
		70 ns
		60 ns
	Supported Memory Types:
		DIMM
		SDRAM
	Memory Module Voltage: 3.3 V
	Associated Memory Slots: 2
		0x0006
		0x0007
	Enabled Error Correcting Capabilities:
		Unknown

Handle 0x0006, DMI type 6, 12 bytes
Memory Module Information
	Socket Designation: M1
	Bank Connections: 0 1
	Current Speed: Unknown
	Type: DIMM SDRAM
	Installed Size: 512 MB (Double-bank Connection)
	Enabled Size: 512 MB (Double-bank Connection)
	Error Status: OK

Handle 0x0007, DMI type 6, 12 bytes
Memory Module Information
	Socket Designation: M2
	Bank Connections: 2 3
	Current Speed: Unknown
	Type: DIMM SDRAM
	Installed Size: 1024 MB (Double-bank Connection)
	Enabled Size: 1024 MB (Double-bank Connection)
	Error Status: OK

Handle 0x0008, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L1 Cache
	Configuration: Enabled, Socketed, Level 1
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 16 KB
	Maximum Size: 16 KB
	Supported SRAM Types:
		Burst
		Pipeline Burst
		Asynchronous
	Installed SRAM Type: Asynchronous
	Speed: Unknown
	Error Correction Type: Unknown
	System Type: Unknown
	Associativity: Unknown

Handle 0x0009, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L2 Cache
	Configuration: Enabled, Socketed, Level 2
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 1024 KB
	Maximum Size: 512 KB
	Supported SRAM Types:
		Burst
		Pipeline Burst
		Asynchronous
	Installed SRAM Type: Burst
	Speed: Unknown
	Error Correction Type: Unknown
	System Type: Unknown
	Associativity: Unknown

Handle 0x000A, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L3 Cache
	Configuration: Enabled, Socketed, Level 3
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 1024 KB
	Maximum Size: 512 KB
	Supported SRAM Types:
		Burst
		Pipeline Burst
		Asynchronous
	Installed SRAM Type: Burst
	Speed: Unknown
	Error Correction Type: Unknown
	System Type: Unknown
	Associativity: Unknown

Handle 0x000B, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J2A1
	Internal Connector Type: 9 Pin Dual Inline (pin 10 cut)
	External Reference Designator: COM 1
	External Connector Type: DB-9 male
	Port Type: Serial Port 16550A Compatible

Handle 0x000C, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J3A1
	Internal Connector Type: 25 Pin Dual Inline (pin 26 cut)
	External Reference Designator: Parallel
	External Connector Type: DB-25 female
	Port Type: Parallel Port ECP/EPP

Handle 0x000D, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1A1
	Internal Connector Type: None
	External Reference Designator: Keyboard
	External Connector Type: Circular DIN-8 male
	Port Type: Keyboard Port

Handle 0x000E, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1A1
	Internal Connector Type: None
	External Reference Designator: PS/2 Mouse
	External Connector Type: Circular DIN-8 male
	Port Type: Keyboard Port

Handle 0x000F, DMI type 9, 13 bytes
System Slot Information
	Designation: PCI Slot #1 - J5B1
	Type: 32-bit PCI
	Current Usage: Unknown
	Length: Long
	ID: 0
	Characteristics:
		5.0 V is provided
		3.3 V is provided

Handle 0x0010, DMI type 10, 6 bytes
On Board Device Information
	Type: Sound
	Status: Disabled
	Description: ADI1886

Handle 0x0011, DMI type 11, 5 bytes
OEM Strings
	String 1: This is the Intel 915G
	String 2: Customer Reference Board

Handle 0x0012, DMI type 12, 5 bytes
System Configuration Options
	Option 1: Jumper settings can be described here.

Handle 0x0013, DMI type 15, 29 bytes
System Event Log
	Area Length: 0 bytes
	Header Start Offset: 0x0000
	Header Length: 16 bytes
	Data Start Offset: 0x0010
	Access Method: General-purpose non-volatile data functions
	Access Address: 0x0000
	Status: Invalid, Full
	Change Token: 0x0000002B
	Header Format: Type 1
	Supported Log Type Descriptors: 3
	Descriptor 1: POST error
	Data Format 1: POST results bitmap
	Descriptor 2: Single-bit ECC memory error
	Data Format 2: Multiple-event
	Descriptor 3: Multi-bit ECC memory error
	Data Format 3: Multiple-event

Handle 0x0014, DMI type 16, 15 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: None
	Maximum Capacity: 4 GB
	Error Information Handle: Not Provided
	Number Of Devices: 2

Handle 0x0015, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0014
	Error Information Handle: No Error
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 512 MB
	Form Factor: DIMM
	Set: 1
	Locator: J6G1
	Bank Locator: DIMM 0
	Type: DDR
	Type Detail: Synchronous
	Speed: 133 MHz (7.5 ns)
	Manufacturer: Not Specified
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Part Number: Not Specified

Handle 0x0016, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x0014
	Error Information Handle: No Error
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 1024 MB
	Form Factor: DIMM
	Set: 1
	Locator: J6H1
	Bank Locator: DIMM 2
	Type: DDR
	Type Detail: Synchronous
	Speed: 133 MHz (7.5 ns)
	Manufacturer: Not Specified
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Part Number: Not Specified

Handle 0x0017, DMI type 19, 15 bytes
Memory Array Mapped Address
	Starting Address: 0x00000000000
	Ending Address: 0x0005FFFFFFF
	Range Size: 1536 MB
	Physical Array Handle: 0x0014
	Partition Width: 0

Handle 0x0018, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00000000000
	Ending Address: 0x0001FFFFFFF
	Range Size: 512 MB
	Physical Device Handle: 0x0015
	Memory Array Mapped Address Handle: 0x0017
	Partition Row Position: Unknown
	Interleave Position: Unknown
	Interleaved Data Depth: Unknown

Handle 0x0019, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00020000000
	Ending Address: 0x0005FFFFFFF
	Range Size: 1 GB
	Physical Device Handle: 0x0016
	Memory Array Mapped Address Handle: 0x0017
	Partition Row Position: Unknown
	Interleave Position: Unknown
	Interleaved Data Depth: Unknown

Handle 0x001A, DMI type 32, 20 bytes
System Boot Information
	Status: <OUT OF SPEC>

Handle 0x001B, DMI type 127, 4 bytes
End Of Table

Handle 0x001C, DMI type 127, 4 bytes
End Of Table

Résultat de lshw :

acer1800
    description: Computer
    product: Aspire 1800
    vendor: Acer
    version: Null
    serial: Null
    width: 32 bits
    capabilities: smbios-2.31 dmi-2.31 smp-1.4 smp
    configuration: boot=oem-specific cpus=1 uuid=37383433-3838-3464-6666-000XXXXXXXXX
  *-core
       description: Motherboard
       product: Aspire 1800
       vendor: Acer
       physical id: 0
       version: Null
       serial: LXA29050XXXXXXXX
     *-firmware
          description: BIOS
          vendor: PHOENIX FirstBIOS
          physical id: 0
          version: V2.90.T05 (05/26/2005)
          size: 111KiB
          capacity: 448KiB
          capabilities: isa pci pcmcia pnp apm upgrade shadowing escd acpi usb agp smartbattery biosbootspecification
     *-cpu
          description: CPU
          product: Intel(R) Pentium(R) 4 CPU 3.20GHz
          vendor: Intel Corp.
          physical id: 4
          bus info: cpu@0
          version: 15.3.4
          serial: 0000-0F34-0000-0000-0000-0000
          slot: WMT478/NWD
          size: 3200MHz
          width: 32 bits
          clock: 200MHz
          capabilities: boot fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc pebs bts sync_rdtsc pni monitor ds_cpl cid xtpr
          configuration: id=0
        *-cache:0
             description: L1 cache
             physical id: 8
             slot: L1 Cache
             size: 16KiB
             capacity: 16KiB
             capabilities: asynchronous internal write-back
        *-cache:1
             description: L2 cache
             physical id: 9
             slot: L2 Cache
             size: 1MiB
             capabilities: burst internal write-back
        *-logicalcpu:0
             description: Logical CPU
             physical id: 0.1
             width: 32 bits
             capabilities: logical
        *-logicalcpu:1
             description: Logical CPU
             physical id: 0.2
             width: 32 bits
             capabilities: logical
     *-cache
          description: L3 cache
          physical id: a
          slot: L3 Cache
          size: 1MiB
          capabilities: burst internal write-back
     *-memory
          description: System Memory
          physical id: 14
          slot: System board or motherboard
          size: 1536MiB
        *-bank:0
             description: DIMM DDR Synchronous 133 MHz (7.5 ns)
             physical id: 0
             slot: J6G1
             size: 512MiB
             width: 64 bits
             clock: 133MHz (7.5ns)
        *-bank:1
             description: DIMM DDR Synchronous 133 MHz (7.5 ns)
             physical id: 1
             slot: J6H1
             size: 1GiB
             width: 64 bits
             clock: 133MHz (7.5ns)
     *-pci
          description: Host bridge
          product: 82915G/P/GV/GL/PL/910GL Memory Controller Hub
          vendor: Intel Corporation
          physical id: 100
          bus info: pci@0000:00:00.0
          version: 04
          width: 32 bits
          clock: 33MHz
        *-pci:0
             description: PCI bridge
             product: 82915G/P/GV/GL/PL/910GL PCI Express Root Port
             vendor: Intel Corporation
             physical id: 1
             bus info: pci@0000:00:01.0
             version: 04
             width: 32 bits
             clock: 33MHz
             capabilities: pci pm msi pciexpress normal_decode bus_master cap_list
             configuration: driver=pcieport-driver
           *-display UNCLAIMED
                description: VGA compatible controller
                product: M24 1P [Radeon Mobility X600]
                vendor: ATI Technologies Inc
                physical id: 0
                bus info: pci@0000:01:00.0
                version: 00
                width: 32 bits
                clock: 33MHz
                capabilities: pm pciexpress vga_controller bus_master cap_list
                configuration: latency=0
        *-usb:0
             description: USB Controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1
             vendor: Intel Corporation
             physical id: 1d
             bus info: pci@0000:00:1d.0
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: uhci bus_master
             configuration: driver=uhci_hcd latency=0 module=uhci_hcd
           *-usbhost
                product: UHCI Host Controller
                vendor: Linux 2.6.24-gentoo-r7 uhci_hcd
                physical id: 1
                bus info: usb@2
                logical name: usb2
                version: 2.06
                capabilities: usb-1.10
                configuration: driver=hub slots=2 speed=12.0MB/s
        *-usb:1
             description: USB Controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2
             vendor: Intel Corporation
             physical id: 1d.1
             bus info: pci@0000:00:1d.1
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: uhci bus_master
             configuration: driver=uhci_hcd latency=0 module=uhci_hcd
           *-usbhost
                product: UHCI Host Controller
                vendor: Linux 2.6.24-gentoo-r7 uhci_hcd
                physical id: 1
                bus info: usb@3
                logical name: usb3
                version: 2.06
                capabilities: usb-1.10
                configuration: driver=hub slots=2 speed=12.0MB/s
        *-usb:2
             description: USB Controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3
             vendor: Intel Corporation
             physical id: 1d.2
             bus info: pci@0000:00:1d.2
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: uhci bus_master
             configuration: driver=uhci_hcd latency=0 module=uhci_hcd
           *-usbhost
                product: UHCI Host Controller
                vendor: Linux 2.6.24-gentoo-r7 uhci_hcd
                physical id: 1
                bus info: usb@4
                logical name: usb4
                version: 2.06
                capabilities: usb-1.10
                configuration: driver=hub slots=2 speed=12.0MB/s
        *-usb:3
             description: USB Controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4
             vendor: Intel Corporation
             physical id: 1d.3
             bus info: pci@0000:00:1d.3
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: uhci bus_master
             configuration: driver=uhci_hcd latency=0 module=uhci_hcd
           *-usbhost
                product: UHCI Host Controller
                vendor: Linux 2.6.24-gentoo-r7 uhci_hcd
                physical id: 1
                bus info: usb@5
                logical name: usb5
                version: 2.06
                capabilities: usb-1.10
                configuration: driver=hub slots=2 speed=12.0MB/s
        *-usb:4
             description: USB Controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
             vendor: Intel Corporation
             physical id: 1d.7
             bus info: pci@0000:00:1d.7
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: pm debug ehci bus_master cap_list
             configuration: driver=ehci_hcd latency=0 module=ehci_hcd
           *-usbhost
                product: EHCI Host Controller
                vendor: Linux 2.6.24-gentoo-r7 ehci_hcd
                physical id: 1
                bus info: usb@1
                logical name: usb1
                version: 2.06
                capabilities: usb-2.00
                configuration: driver=hub slots=8 speed=480.0MB/s
              *-usb:0
                   description: Mass storage device
                   product: USB DISK 2.0
                   physical id: 1
                   bus info: usb@1:1
                   logical name: scsi2
                   version: 1.10
                   serial: 078A0B4C0FC3
                   capabilities: usb-2.00 scsi emulated scsi-host
                   configuration: driver=usb-storage maxpower=200mA speed=480.0MB/s
                 *-disk
                      description: SCSI Disk
                      physical id: 0.0.0
                      bus info: scsi@2:0.0.0
                      logical name: /dev/sdb
                      size: 1866MiB (1956MB)
                      capabilities: partitioned partitioned:dos
                      configuration: signature=0001492f
                    *-volume
                         description: EXT3 volume
                         vendor: Linux
                         physical id: 1
                         bus info: scsi@2:0.0.0,1
                         logical name: /dev/sdb1
                         logical name: /media/disk
                         version: 1.0
                         serial: 209baf8e-ad4d-47eb-9cfe-c422bb13d569
                         size: 1859MiB
                         capacity: 1859MiB
                         capabilities: primary journaled extended_attributes large_files huge_files recover ext3 ext2 initialized
                         configuration: created=2009-07-04 21:51:54 filesystem=ext3 modified=2009-07-04 21:52:29 mount.fstype=ext3 mount.options=rw,nosuid,nodev,data=ordered mounted=2009-07-04 21:52:29 state=mounted
              *-usb:1
                   description: Mass storage device
                   product: USB 2.0  5 IN 1 CARD READER
                   vendor: Aspire 1800
                   physical id: 8
                   bus info: usb@1:8
                   logical name: scsi0
                   version: 3.23
                   serial: 040525200000
                   capabilities: usb-2.00 scsi emulated scsi-host
                   configuration: driver=usb-storage maxpower=96mA speed=480.0MB/s
                 *-disk
                      description: SCSI Disk
                      product: USB20 HS-5IN1
                      vendor: acer
                      physical id: 0.0.0
                      bus info: scsi@0:0.0.0
                      logical name: /dev/sda
                      version: 3.23
                      capabilities: removable
                    *-medium
                         physical id: 0
                         logical name: /dev/sda
        *-pci:1
             description: PCI bridge
             product: 82801 PCI Bridge
             vendor: Intel Corporation
             physical id: 1e
             bus info: pci@0000:00:1e.0
             version: d3
             width: 32 bits
             clock: 33MHz
             capabilities: pci subtractive_decode bus_master cap_list
           *-firewire
                description: FireWire (IEEE 1394)
                product: TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
                vendor: Texas Instruments
                physical id: 0
                bus info: pci@0000:0a:00.0
                version: 00
                width: 32 bits
                clock: 33MHz
                capabilities: pm ohci bus_master cap_list
                configuration: driver=ohci1394 latency=32 maxlatency=4 mingnt=2 module=ohci1394
           *-network:0
                description: Ethernet interface
                product: NetXtreme BCM5788 Gigabit Ethernet
                vendor: Broadcom Corporation
                physical id: 1
                bus info: pci@0000:0a:01.0
                logical name: eth0
                version: 03
                serial: 00:02:3f:08:76:0b
                size: 100MB/s
                capacity: 1GB/s
                width: 32 bits
                clock: 66MHz
                capabilities: pm vpd msi bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
                configuration: autonegotiation=on broadcast=yes driver=tg3 driverversion=3.86 duplex=full firmware=5788-v3.04 ip=88.160.37.59 latency=32 link=yes mingnt=64 module=tg3 multicast=yes port=twisted pair speed=100MB/s
           *-network:1 UNCLAIMED
                description: Ethernet controller
                product: [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)
                vendor: Linksys, A Division of Cisco Systems
                physical id: 2
                bus info: pci@0000:0a:02.0
                version: 00
                width: 32 bits
                clock: 33MHz
                capabilities: pm bus_master cap_list
                configuration: latency=32 maxlatency=32 mingnt=32
           *-pcmcia
                description: CardBus bridge
                product: CB1410 Cardbus Controller
                vendor: ENE Technology Inc
                physical id: 4
                bus info: pci@0000:0a:04.0
                version: 01
                width: 32 bits
                clock: 33MHz
                capabilities: pcmcia bus_master cap_list
                configuration: driver=yenta_cardbus latency=176 maxlatency=5 mingnt=192 module=yenta_socket
        *-multimedia
             description: Multimedia audio controller
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller
             vendor: Intel Corporation
             physical id: 1e.2
             bus info: pci@0000:00:1e.2
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: pm bus_master cap_list
             configuration: driver=Intel ICH latency=0 module=snd_intel8x0
        *-communication UNCLAIMED
             description: Modem
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller
             vendor: Intel Corporation
             physical id: 1e.3
             bus info: pci@0000:00:1e.3
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: pm generic cap_list
             configuration: latency=0
        *-isa
             description: ISA bridge
             product: 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
             vendor: Intel Corporation
             physical id: 1f
             bus info: pci@0000:00:1f.0
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: isa bus_master
             configuration: latency=0
        *-ide
             description: IDE interface
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller
             vendor: Intel Corporation
             physical id: 1f.1
             bus info: pci@0000:00:1f.1
             version: 03
             width: 32 bits
             clock: 33MHz
             capabilities: ide bus_master
             configuration: driver=PIIX_IDE latency=0
           *-ide
                description: IDE Channel 0
                physical id: 0
                bus info: ide@0
                logical name: ide0
                clock: 33MHz
              *-disk
                   description: ATA Disk
                   product: FUJITSU MHV2080AH
                   vendor: Fujitsu
                   physical id: 0
                   bus info: ide@0.0
                   logical name: /dev/hda
                   version: 000000A0
                   serial: NT61T732MV7P
                   size: 74GiB (80GB)
                   capacity: 74GiB (80GB)
                   capabilities: ata dma lba iordy smart security pm apm partitioned partitioned:dos
                   configuration: apm=off mode=udma5 signature=00096055 smart=on
                 *-volume:0
                      description: EXT3 volume
                      vendor: Linux
                      physical id: 1
                      bus info: ide@0.0,1
                      logical name: /dev/hda1
                      logical name: /boot
                      version: 1.0
                      serial: b6f404c7-02cb-4ffe-a72b-2cd29d2a912e
                      size: 39MiB
                      capacity: 39MiB
                      capabilities: primary bootable journaled extended_attributes large_files huge_files recover ext3 ext2 initialized
                      configuration: created=2008-05-04 20:45:10 filesystem=ext3 modified=2009-07-04 21:32:32 mount.fstype=ext2 mount.options=rw,noatime mounted=2009-07-04 21:32:32 state=mounted
                 *-volume:1
                      description: Linux swap volume
                      physical id: 2
                      bus info: ide@0.0,2
                      logical name: /dev/hda2
                      version: 1
                      serial: 1f50bb3c-071d-4cb3-a8ee-72664cf333f7
                      size: 980MiB
                      capacity: 980MiB
                      capabilities: primary nofs swap initialized
                      configuration: filesystem=swap pagesize=4096
                 *-volume:2
                      description: EXT3 volume
                      vendor: Linux
                      physical id: 3
                      bus info: ide@0.0,3
                      logical name: /dev/hda3
                      logical name: /
                      version: 1.0
                      serial: 2da1caaa-0a13-4521-9414-d89a4a66d655
                      size: 9773MiB
                      capacity: 9773MiB
                      capabilities: primary journaled extended_attributes large_files huge_files recover ext3 ext2 initialized
                      configuration: created=2008-05-04 20:46:36 filesystem=ext3 modified=2009-07-04 21:32:31 mount.fstype=ext3 mount.options=rw,noatime,data=ordered mounted=2009-07-04 21:32:31 state=mounted
                 *-volume:3
                      description: Extended partition
                      physical id: 4
                      bus info: ide@0.0,4
                      logical name: /dev/hda4
                      size: 63GiB
                      capacity: 63GiB
                      capabilities: primary extended partitioned partitioned:extended
                    *-logicalvolume:0
                         description: Linux filesystem partition
                         physical id: 5
                         logical name: /dev/hda5
                         logical name: /home
                         capacity: 4777MiB
                         configuration: mount.fstype=ext3 mount.options=rw,noatime,data=ordered state=mounted
                    *-logicalvolume:1
                         description: Linux filesystem partition
                         physical id: 6
                         logical name: /dev/hda6
                         logical name: /media/stockage
                         capacity: 59GiB
                         configuration: mount.fstype=ext3 mount.options=rw,noatime,data=ordered state=mounted
              *-cdrom
                   description: DVD-RAM writer
                   product: MATSHITADVD-RAM UJ-830S
                   physical id: 1
                   bus info: ide@0.1
                   logical name: /dev/hdb
                   version: 1.00
                   capabilities: packet atapi cdrom removable nonmagnetic dma lba iordy audio cd-r cd-rw dvd dvd-r dvd-ram
                   configuration: mode=udma2 status=nodisc
        *-serial UNCLAIMED
             description: SMBus
             product: 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller
             vendor: Intel Corporation
             physical id: 1f.3
             bus info: pci@0000:00:1f.3
             version: 03
             width: 32 bits
             clock: 33MHz
             configuration: latency=0

Est ce qu'un fin connaisseur passant par la saura me dire si je peux remplacer mon P4 kipuékichof par un Intel Core ?
Merci !

#19 Re : -1 »  [Upgrade]Carte mère compatible C2Duo ? » Le 04/07/2009, à 22:13

Aurel07
Réponses : 2

Non mais je ne veux pas changer de carte mere ! J'ai lu sur wikipedia que certaines cartes meres pour processeur P4 pouvait prendre des Core (http://fr.wikipedia.org/wiki/LGA_775), mais je suis incapable de savoir si MA carte mere possede le bon socket qui va bien et marche avec les core.

#20 Re : -1 »  Où puis-je acheter un nom de domaine? » Le 02/06/2009, à 18:28

Aurel07
Réponses : 24

gandi.net, l'ancienne boite de laurent Chemla. Je t'invite a lire son bouquin en meme temps (confessions d'un voleur, disponible sur internet en CC), et tu verras que c'est quelque chose que tu ne devrais pas payer...

#21 Re : -1 »  Où puis-je acheter un nom de domaine? » Le 03/06/2009, à 15:41

Aurel07
Réponses : 24

Un nom de domaine est quelque chose qui devrait être gratuit (un nom de domaine hein, pas un hebergement). Un nom de domaine, c'est juste un nom donné à une adresse IP. Au début c'etait une assoc americaine qui gerait ca, puis suite a un pepin, ils se sont mis a les vendre, Chemla et ses potes ont trouve ca super ridicule, leur ont achete au tarif de gros plein de noms de domaine et les ont revendus 20 fois moins chers. C'etait y'a 10 ans ou plus, maintenant, ils sont peut-etre plus chers que les autres. Cependant, je vois de nombreux sites enregistrés chez eux donc je pense pas que ce soit un mauvais choix.

#22 Re : -1 »  [python, pygtk] Import de photos via gphoto2 » Le 08/05/2009, à 12:59

Aurel07
Réponses : 7

En effet, je vois ou se situe le probleme. Chez moi, y'a 4 lignes pour cette commande, et je prenais la derniere (ligne 3 (vu qu'on part de 0)) :

Modèle                        Port                                             
----------------------------------------------------------
Canon Digital Rebel XT (normal mode) usb:            
Canon Digital Rebel XT (normal mode) usb:002,004

Du coup, il suffit de changer le [3] en [2] a la ligne 205 du script python.

Je regarderai ton prog, voir si je peux aider !

#23 Re : -1 »  [python, pygtk] Import de photos via gphoto2 » Le 21/05/2009, à 11:41

Aurel07
Réponses : 7

Salut,

Je viens de faire quelques modifs (j'ai ete bien occupe la semaine derniere, pas le temps d'arranger le programme...). Ca corrigera le dernier probleme (celui avec les exifs qui veulent pas s'ecrire) (en fait, si les exifs ne veulent pas s'ecrire, je passe (try, except, pass)) plus 2 ou 3 autres, mais pour le reste, ca se passe tres bien chez moi... alors j'ai du mal a voir ce qu'il faudrait corriger...
je vais essayer sur ma debian un de ces 4, voir si c'est different.

Voila le code (les .glade ne changent pas) :

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# Licence : GPLv3 voir : http://gplv3.fsf.org/
# Dependances : python, gtk2, pygtk, libjpeg-progs, gphoto2, pyexiv2

try:
    import os, sys
    import subprocess
    import shutil
    import gobject
    import time
    import threading
except:    
    print('Un problème est survenu, les bibliothèques python de base semblent manquer...\n(Ré)installer python semble une bonne idée.')
    sys.exit(1)    
    
try:
    import gtk
    import gtk.glade
    import pygtk
    pygtk.require("2.0")
except:
    print('gtk2 et libglade doivent etre installés')
    sys.exit(1)
      
try:   
    import pyexiv2    #Il faut pyexiv v.1.3 minimum pour pouvoir lire les lenstype dans les exifs.
    import Image      #Necessaire pour tourner les images
    import time
except:
    pass
    
gobject.threads_init()        #Pour que les threads soient lancés au moment opportun.
        
        
#############################################    
####  Fonctions agissant sur les photos  ####
#############################################        
        
def renom():
    #Fonction pour renommer les photos
    ext_det = Gui.image.split('.')
    ext = ext_det[len(ext_det) - 1]
    nom = ext_det[0]
    pattern_mod = Gui.renom_pattern.replace('%name', nom)
    nombis = Gui.date.strftime(pattern_mod) + '.' + ext
    os.rename(Gui.image, nombis)
    Gui.image = nombis
        
     
def lenstype():
    #Fonction pour rajouter le lenstype dans les exifs. 
    #C'est bien pour les Canon 350D qui ne le font pas automatiquement, et ca permet d'avoir la correction d'abheration avec DPP
    lens = Gui.image_exif.interpretedExifValue('Exif.CanonCs.Lens')
    lenstype_dic={"18.0 - 55.0" : 45, "200.0" : 151, "50.0" : 1}   #Dictionnaire des lenstype, a compléter bien sur !
    Gui.image_exif['Exif.CanonCs.Lens'] = lenstype_dic[lens]
    Gui.image_exif.writeMetadata()      
             
             
def pivot():
    #Fonction pour pivoter les images selon les données exifs. 
    #A la fin, la donnée exifs d'orientation est toujours mise a 1, c'est a dire que la premiere ligne de pixel est en haut, et la premiere colonne a gauche.
    #Meriterait une simplification
    orient = 0
    try:
        orient = Gui.image_exif["Exif.Image.Orientation"]      #Cf le manuel d'exifs pour comprendre les significations des chiffres
    except:
        pass
        
    if orient == 2:
        subprocess.Popen(["jpegtran", "-flip", "horizontal", "-copy", "all", "-outfile", "tmp", Gui.image])  #je prefere passer par jpegtran, je maitrise pas PIL
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 3:
        a=subprocess.Popen(["jpegtran", "-rotate", "180", "-copy", "all", "-outfile", "tmp", Gui.image])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 4:
        a=subprocess.Popen(["jpegtran", "-flip", "vertical", "-copy", "all", "-outfile", "tmp", Gui.image])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 5:
        a=subprocess.Popen(["jpegtran", "-flip", "horizontal", "-copy", "all", "-outfile", "tmp1", Gui.image])
        a.wait()
        a=subprocess.Popen(["jpegtran", "-rotate", "270", "-copy", "all", "-outfile", "tmp", "tmp1"])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 6:
        a=subprocess.Popen(["jpegtran", "-rotate", "90", "-copy", "all", "-outfile", "tmp", Gui.image])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 7:
        a=subprocess.Popen(["jpegtran", "-flip", "horizontal", "-copy", "all", "-outfile", "tmp1", Gui.image])
        a.wait()
        a=subprocess.Popen(["jpegtran", "-rotate", "90", "-copy", "all", "-outfile", "tmp", "tmp1"])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    if orient == 8:
        a=subprocess.Popen(["jpegtran", "-rotate", "270", "-copy", "all", "-outfile", "tmp", Gui.image])
        a.wait()
        os.rename("tmp", Gui.image)
        Gui.image_exif["Exif.Image.Orientation"]=1
    
    try:
        Gui.image_exif.writeMetadata()
    except:
        print("erreur d'écriture des metadonnées")
            
        
def classe():
    #Pour classer (ca deplace les images dans le dossier approprié
    Gui.repclasse = Gui.date.strftime(Gui.classe_pattern)
    if not os.path.isdir(Gui.basedossier + "/" + Gui.repclasse):
        os.makedirs(Gui.basedossier + "/" + Gui.repclasse)
    shutil.move(Gui.image, Gui.basedossier + "/" + Gui.repclasse) 
        
        
def catalogue():
    #Créer les liens dans un dossier catalogue.
    if not os.path.isdir(Gui.dossier_catalogue):
        os.makedirs(Gui.dossier_catalogue)
       
    if Gui.classerphotoselect.get_active():
        os.symlink(Gui.basedossier + "/" + Gui.repclasse + "/" + Gui.image, Gui.dossier_catalogue + "/" + Gui.image)
    else:
        os.symlink(Gui.basedossier + "/"+ Gui.image, Gui.dossier_catalogue + "/" + Gui.image)
        

###########################################    
####  Classe de la fenetre principale  ####
###########################################        
     
class Interface:
    """Mon programme d'import de photos depuis mon Canon 350D"""

    def __init__(self):     
        #Set the Glade file
        self.gui=gtk.glade.XML(install_dossier + "/Interface.glade")
         
        #Dans la foulee on chope la fenetre principale, ca sert a rien c'est pour
        #montrer qu'on peut le faire c'est tout ^^
        self.win=self.gui.get_widget("MainWindow")
        self.win.set_title('PympPhotos')
       
                
        #On chope le reste, et ca, ca va servir...
        self.gphotoappselect = self.gui.get_widget("gphotoappselect")  
        self.labelgphoto = self.gui.get_widget("labelgphoto")
        self.importdossierselect = self.gui.get_widget("importdossierselect")
        self.iconview = self.gui.get_widget("iconview")
        self.dossierimport = self.gui.get_widget("dossierimport")
        self.dossierbase = self.gui.get_widget("dossierbase")
        self.renommerphotoselect = self.gui.get_widget("renommerphotoselect")
        self.classerphotoselect = self.gui.get_widget("classerphotoselect")
        self.creercatalogueselect = self.gui.get_widget("creercatalogueselect")
        self.renompattern = self.gui.get_widget("renompattern")
        self.classpattern = self.gui.get_widget("classpattern")
        self.pivoterselect = self.gui.get_widget("pivoterselect")
        self.objectifcr2select = self.gui.get_widget("objectifcr2select")
        self.dossiercatalogue = self.gui.get_widget("dossiercatalogue")
        self.importall = self.gui.get_widget("importall")   
        
        #On relie les signaux (cliques sur boutons, cochage des cases, ...) aux fonctions appropriées
        dic = { "on_MainWindow_destroy" : gtk.main_quit,
                "on_Fermer_clicked" : gtk.main_quit,
                "on_Go_clicked" : self.go_clicked,
                "on_rafrachir_bouton_clicked" : self.rafraichir_clicked,
                "on_select_all_bouton_clicked" : self.select_all, 
                "on_aiderenom_clicked" : self.aiderenom_fenetre,
                "on_aideclass_clicked" : self.aideclass_fenetre
                }
                                
        #Auto-connection des signaux (ca fait un peu film de SF)        
        self.gui.signal_autoconnect(dic)
                
        #création des repertoires necessaires
        self.home_path = os.environ['HOME']
        self.importphotos_path = self.home_path + "/.importphotos"
        self.thumbs_path = self.importphotos_path + "/thumbs"
        if not os.path.isdir(self.importphotos_path):
            os.makedirs(self.importphotos_path)
        if not os.path.isdir(self.thumbs_path):
            os.makedirs(self.thumbs_path)
                        
        #set-up des valeurs par defaut    
        self.dossierimport.set_filename("/media")
        self.dossierbase.set_filename(self.home_path + "/Images/Photos")
        self.dossiercatalogue.set_filename(self.home_path)
        self.classerphotoselect.set_active(True)
        self.objectifcr2select.set_active(True)
        self.pivoterselect.set_active(True)
                
        #Test préliminaire au lancement, pour voir si un appareil est connecté          
        self.testapp()
                                               
    def testapp(self):
        #Comme y'a pas de bindings pour python de libgphoto2, on est obligés de passer par le programme gphoto2
        gphoto2 = subprocess.Popen(["gphoto2", "--auto-detect"], stdout=subprocess.PIPE)
        gphoto2_result = gphoto2.stdout.read()
               
        #Teste la presence d'un appareil photo par gphoto2 et l'affiche dans labelgphoto
        if (gphoto2_result.count("\n")>2):                                      #Si appareil photo present...
            affiche_app = gphoto2_result.splitlines()[2]                        #on attrape le nom de l'appareil
            self.labelgphoto.set_text(affiche_app)                              #Affiche l'appareil en dessous de la case a cocher
            self.gphotoappselect.set_sensitive(True)                            #Rend la case a cocher sensible
            self.gphotoappselect.set_active(True)                               #selectionne par defaut
        else:
            self.labelgphoto.set_text("Pas d'appareil détecté")                 #Sinon, "pas d'appareil" est affiché.
                                 
    def rafraichir_clicked(self, widget):
        self.rafraichir = Progress_rafraichir()                                 #On "instancie" la classe de progression du rafraichissement des icones
                    
    def select_all(self, widget):
        self.iconview.select_all()
   
    def go_clicked(self, widget):                                               #On "instancie" la classe de progression de l'import
        self.progress_action = Progress_action()
        
    def aiderenom_fenetre(self, widget):                                        #Fenetre d'aide pour remplir renommer les photos
        a=AideRenom()
    
    def aideclass_fenetre(self, widget):                                        #Pareil mais pour les classer...
        b=AideClass()
        

##################################    
####  Aide pour le renommage  ####
##################################

class AideRenom:

    def __init__(self):
        #Initialisation de l'interface de la fenetre 
        self.fenetre = gtk.glade.XML(install_dossier + "/aide_renom.glade")         #Tout est dans le fichier glade
        self.dialog=self.fenetre.get_widget("dialog1")
        self.dic1 = {"on_bouton_fermer_clicked" : self.fermeture, 
                     "on_dialog1_destroy" : self.fermeture}
        self.fenetre.signal_autoconnect(self.dic1)

    def fermeture(self, widget):
        self.dialog.destroy()
        

#################################    
####  Aide pour le classage  ####
#################################

class AideClass:

    def __init__(self):
        #Initialisation de l'interface de la fenetre 
        self.fenetre = gtk.glade.XML(install_dossier + "/aide_class.glade") 
        self.dialog=self.fenetre.get_widget("dialog1")
        self.dic1 = {"on_bouton_fermer_clicked" : self.fermeture, 
                     "on_dialog1_destroy" : self.fermeture}
        self.fenetre.signal_autoconnect(self.dic1)
        
    def fermeture(self, widget):
        self.dialog.destroy()
        

##########################################    
####  Rafraichissement de l'iconview  ####
##########################################

class Progress_rafraichir:

    def __init__(self):
        #Initialisation de l'interface de la fenetre de progression
        self.progress = gtk.glade.XML(install_dossier + "/Progress.glade") 
        self.progress_win = self.progress.get_widget("dialog1")
        self.progress_label = self.progress.get_widget("progress_label")
        self.info_label = self.progress.get_widget("info_label")
        self.progress_bar = self.progress.get_widget("progressbar1")
        self.progress_stop_button = self.progress.get_widget("stop_button")
        
        #Dictionnaire pour fermer la fenetre
        self.dic1 = {"on_stop_button_clicked" : self.close_progress, 
                     "on_dialog1_destroy" : self.close_progress}
        self.progress.signal_autoconnect(self.dic1)
        
        #On affiche ce qu'on fait (création des icones)
        self.info_label.set_text("Création des thumbnails...")
        self.progress_label.set_text('Veuillez patienter...')
        
        self.thread_icon = Thread_Icon()                        #On prepare le thread qui va faire tout le boulot
        self.thread_icon.start()                                #On le lance
        timer = gobject.timeout_add (100, self.pulsate)         #Fait pulser la barre a intervalles reguliers 
        
        #Rq: Il n'est pas possible de faire une vraie barre de progression car lorsqu'on import avec gphoto2, 
        #c'est un seul processus qui ne rend pas la main entre les images (et du coup, on ne peut pas l'interrompre avant qu'il ai finit)
    
    def pulsate(self):
        if self.thread_icon.is_alive():             #Tant que le thread est en cours, 
            self.progress_bar.pulse()               #on fait pulser la barre
            return True                            #et on renvoie True pour que gobject.timeout recommence
        else:
            self.progress_bar.set_fraction(1)
            self.progress_bar.set_text('Thumbnails Importés!')
            self.progress_win.destroy()
            return False
            
    def close_progress(self, widget):
        #subprocess.Popen(["kill", "-9", str(self.thread_icon.pid)])   #Je sais pas pourquoi, mais ca kill l'interface principale...
        self.progress_win.destroy()
        
        

#############################################    
####  Thread de création des thumbnails  ####
#############################################       
        
        
class Thread_Icon(threading.Thread):
    def __init__(self):
        super(Thread_Icon, self).__init__()
        self.pid=os.getpid()                                                    #on chope le pid pour pouvoir le tuer apres, meme si ca marche pas...
        
    def run(self):
        Gui.list_thumbs = gtk.ListStore(str, gtk.gdk.Pixbuf, int)
        if Gui.gphotoappselect.get_active():                                   #Si l'appareil detecte par gphoto2 est selectionné...
            os.chdir(Gui.thumbs_path)                                          #On se déplace dans le dossier qui va récupérer tous les thumbs
            #On récupère les thumbnails avec l'option qui va bien de gphoto2
            gphoto_thumbs_en_cours = subprocess.Popen(["gphoto2", "-T"], stdout=subprocess.PIPE)
            gphoto2_thumb_result=gphoto_thumbs_en_cours.stdout.read()           #On recupere la sortie de l'import des thumbs
            gphoto2_list_thumbs = gphoto2_thumb_result.splitlines()
                        
            for indice in range(1, len(gphoto2_list_thumbs)):                         #Pour tous les thumbs dans la liste...
                mots = gphoto2_list_thumbs[indice-1].split(" ")
                thumb = mots[len(mots)-1]                                              #C'est le nom du thumbnail !
                pixbuf = gtk.gdk.pixbuf_new_from_file(Gui.thumbs_path + "/" + thumb)   #on creer un pixbuf
                Gui.list_thumbs.append([thumb, pixbuf, indice])                        #et on l'ajoute a la liste : 
                #le nom, le pixbuf, et un numero qui permet de savoir quelle image correspond a quel thumbnail (gphoto2, c'est un peu mal fait quand meme...)
               
        elif Gui.importdossierselect.get_active():                             #Si l'import de dossier est activé.
            Gui.impdossier = Gui.dossierimport.get_filename()                   #On récupère le path du dossier
            images_import = os.listdir(Gui.impdossier)                          #On liste les fichiers et on les trie par ordre alphabetique
            images_import.sort()
            
            for image in images_import:
                try:                                    #On passe par try, parce que les fichiers autre que les images ne passeront pas
                    pixbuf = gtk.gdk.pixbuf_new_from_file(Gui.impdossier + "/" + image)
                    height = pixbuf.get_height()
                    width = pixbuf.get_width()
                    if width >= height:                                          # redimensionnement du pixbuff en max(height, width) = 160          
                        nheight = 160*height/width
                        scaled_buf = pixbuf.scale_simple(160,nheight,gtk.gdk.INTERP_BILINEAR)
                    else:
                        nwidth = 160*width/height
                        scaled_buf = pixbuf.scale_simple(nwidth,160,gtk.gdk.INTERP_BILINEAR)
                        
                    Gui.list_thumbs.append([image, scaled_buf, 0])     #le nom, le pixbuf, et 0 pour savoir que l'image vient du dossier d'import et pas de gphoto2
                except:
                    pass
            
        #Generation de la IconView
        Gui.iconview.set_pixbuf_column(1)                              
        Gui.iconview.set_text_column(0)
       #Gui.iconview.set_item_width(180)
        Gui.iconview.set_model(Gui.list_thumbs)   
           
        #supprime les thumbnails de thumb_path
        for thumb in os.listdir(Gui.thumbs_path):
            os.remove(Gui.thumbs_path + "/" + thumb)
         
        
    
###########################################################    
####  Classe de la fenetre de progression des actions  ####
###########################################################

class Progress_action:

    def __init__(self):
        #Initialisation de l'interface de la fenetre de progression
        self.progress = gtk.glade.XML(install_dossier + "/Progress.glade") 
        self.progress_win = self.progress.get_widget("dialog1")
        self.progress_label = self.progress.get_widget("progress_label")
        self.info_label = self.progress.get_widget("info_label")
        self.progress_bar = self.progress.get_widget("progressbar1")
        self.progress_stop_button = self.progress.get_widget("stop_button")
        self.dic1 = {"on_stop_button_clicked" : self.close_progress, 
                     "on_dialog1_destroy" : self.close_progress}
        self.progress.signal_autoconnect(self.dic1)
        
        #on récupère la liste des images selectionnées
        self.selection = Gui.iconview.get_selected_items()
                
        if self.selection and not Gui.importall.get_active():      #Si on n'a pas coche la case "tout importer", alors ca va bien se passer, tu auras une barre de progression qui avance en meme temps que chaque photo est traitee, etc. Pas de probleme donc.
            self.info_label.set_label("Import en cours...")
            self.nombre_photos = len(self.selection)                #Combien y'a t'il d'images selectionnées ???
            task = self.action()                                    #Je sais pas pourquoi, mais ca marche. Cf faq de pyGTK, comment faire une progressbar
            gobject.idle_add(task.next)
        elif Gui.importall.get_active():                           #en mode tout importer, la barre de progression pulse seulement vu que le thread gphoto2 -P ne rend pas la main entre 2 photos. (et que c'est chiant de lui demander le nombre de photos)
            self.info_label.set_text("Import de toutes les photos...")
            self.progress_label.set_text('Veuillez patienter...')
            self.thread_import = Thread_Import()                    #On prepare le thread qui va faire tout le boulot
            self.thread_import.start()                              #On le lance
            timer = gobject.timeout_add (100, self.pulsate)         #Fait pulser la barre a intervalles reguliers 
        else:
            self.info_label.set_label("Pas de fichier sélectionnés")
            

    def pulsate(self):
        if self.thread_import.is_alive():           #Tant que le thread est en cours, 
            self.progress_bar.pulse()               #on fait pulser la barre
            return True                            #et on renvoie True pour que gobject.timeout recommence
        else:
            self.progress_bar.set_fraction(1)
            self.progress_bar.set_text('Images Importées!')
            return False
        
    
    def action(self):
        #recuperation des données rentrées :
        Gui.renom_pattern = Gui.renompattern.get_text()                         #comment renommer
        Gui.classe_pattern = Gui.classpattern.get_text()                        #comment classer
        Gui.dossier_catalogue = Gui.dossiercatalogue.get_filename()             #comment classer
        Gui.basedossier = Gui.dossierbase.get_filename()                        #on recupere le dossier de base
        os.chdir(Gui.basedossier)                                               #on se place dans ce dossier
        
        numero = 1
        
        for index in self.selection:                                           # Pout chaque image selectionnée...
            thumb_carac = Gui.list_thumbs[index[0]]                             #recuperer le nom et le numero associés aux thumbnails
            nom = thumb_carac[0]
            num = thumb_carac[2]
            
            if num == 0:                                                       #alors, c'est un importdossier
                shutil.copy2(Gui.impdossier + "/" + nom, Gui.basedossier)      #on copie dans le dossier de base
                Gui.image=nom                                                  #Nom de l'image
                Gui.image_exif = pyexiv2.Image(Gui.image)                      #Exifs de l'image
                Gui.image_exif.readMetadata()
                try:
                    Gui.date = Gui.image_exif['Exif.Image.DateTime']               #Date de creation par les exifs
                except:
                    Gui.date = 0
                
                if Gui.renommerphotoselect.get_active() and Gui.date:
                    renom()
                if Gui.objectifcr2select.get_active() and Gui.image.endswith((".CR2", ".cr2")):
                    lenstype()
                if Gui.pivoterselect.get_active() and Gui.image.endswith((".JPG", ".jpg", ".jpeg", ".JPEG")):
                    pivot()
                if Gui.classerphotoselect.get_active() and Gui.date:
                    classe()
                if Gui.creercatalogueselect.get_active():
                    catalogue()
                
            elif num > 0:                               #alors c'est par gphoto2
                gphoto_import_process = subprocess.Popen(["gphoto2", "-p", str(num)], stdout=subprocess.PIPE)
                gphoto_import_process.wait()
                gphoto_import_result = gphoto_import_process.stdout.read()
                a = gphoto_import_result.split(' ')
                Gui.image = a[len(a)-1].split("\n")[0]
                Gui.image_exif = pyexiv2.Image(Gui.image)
                Gui.image_exif.readMetadata()
                try:
                    Gui.date = Gui.image_exif['Exif.Image.DateTime']               #Date de creation par les exifs
                except:
                    Gui.date = 0
                
                if Gui.renommerphotoselect.get_active():
                    renom()
                if Gui.objectifcr2select.get_active() and Gui.image.endswith((".CR2", ".cr2")):
                    lenstype()
                if Gui.pivoterselect.get_active() and Gui.image.endswith((".JPG", ".jpg", ".jpeg", ".JPEG")):
                    pivot()
                if Gui.classerphotoselect.get_active():
                    classe()
                if Gui.creercatalogueselect.get_active():
                    catalogue()
            
            fraction = float(numero) / self.nombre_photos                              # Faut faire avancer la barre de défilement
            self.progress_bar.set_fraction(fraction)
            self.progress_bar.set_text(str(numero) + "/" + str(self.nombre_photos) + "Images")
            self.progress_label.set_text("Import de " + Gui.image + " terminé")
            numero = numero + 1
            yield True                                                          #quand le gobject.idle_add recoit ce True, il met a jour la fenetre
            
        yield False
        self.info_label.set_label("Import terminé !")
            
###fonction pour fermer la fenetre 
            
    def close_progress(self, widget):
        self.progress_win.destroy()


################################################    
####  Thread d'import de toutes les photos  ####
################################################

class Thread_Import(threading.Thread):
    def __init__(self):
        super(Thread_Import, self).__init__()
        self.pid=os.getpid()
        
    def run(self):           
        time.sleep(1)
        #recuperation des données rentrées :
        Gui.renom_pattern = Gui.renompattern.get_text()                         #comment renommer
        Gui.classe_pattern = Gui.classpattern.get_text()                        #comment classer
        Gui.dossier_catalogue = Gui.dossiercatalogue.get_filename()             #comment catalogue
        Gui.basedossier = Gui.dossierbase.get_filename()                        #on recupere le dossier de base
        os.chdir(Gui.basedossier)                                               #on se place dans ce dossier
                        
        if Gui.gphotoappselect.get_active(): 
            self.import_tout = subprocess.Popen(["gphoto2", "-P"])              #Importe toutes les photos via gphoto2
            self.import_tout.wait()
                         
        elif Gui.importdossierselect.get_active(): 
            Gui.progress_action.info_label.set_label("Import des images depuis le dossier...")
            Gui.impdossier = Gui.dossierimport.get_filename()
            for Gui.image in os.listdir(Gui.impdossier):
                if Gui.image.endswith((".CR2", ".cr2", ".JPG", ".jpg", ".jpeg", ".JPEG", ".png", ".PNG", ".gif", ".GIF")):
                    shutil.copy2(Gui.impdossier + "/" + Gui.image, Gui.basedossier)
                                    
        liste_image1 = os.listdir(Gui.basedossier)
        liste_image=[]        
        for i in liste_image1:
            if i.endswith((".CR2", ".cr2", ".JPG", ".jpg", ".jpeg", ".JPEG", ".png", ".PNG", ".gif", ".GIF")):
                liste_image.append(i)
                
        for Gui.image in liste_image:
            Gui.image_exif = pyexiv2.Image(Gui.image)                          #Exifs de l'image
            Gui.image_exif.readMetadata()
            try:
                Gui.date = Gui.image_exif['Exif.Image.DateTime']               #Date de creation par les exifs
            except:
                Gui.date = 0
               
            if Gui.renommerphotoselect.get_active() and Gui.date:
                renom()
            if Gui.objectifcr2select.get_active() and Gui.image.endswith((".CR2", ".cr2")):
                lenstype()
            if Gui.pivoterselect.get_active() and Gui.image.endswith((".JPG", ".jpg", ".jpeg", ".JPEG")):
                pivot()
            if Gui.classerphotoselect.get_active() and Gui.date:
                classe()
            if Gui.creercatalogueselect.get_active():
                catalogue()
                
        Gui.progress_action.info_label.set_label("Import terminé !")

###########################################################    
####  Initialisation et appel de la classe principale  ####
###########################################################            
                        
if __name__ == "__main__":
    install_dossier=sys.path[0]                                                #On recupere le dossier d'install
    Gui = Interface()                                                          #Initialise l'interface
    gtk.main()                                                                 #Lance la boucle principale

PS : modifs apportées le 22 mai a 13h51, testé sur Jaunty Jackalope, pas de probleme rencontre apres quelques tests. (sudo apt-get install libjpeg-progs pour avoir le pivotage)

#24 Re : -1 »  DivFix ou comment réparer ses divx tous cassés :) » Le 08/05/2009, à 18:09

Aurel07
Réponses : 6

Salut l e . n o x.

Je suis en train de regarder ton programme, et j'ai quelques commentaires :

- Deja, la fonction os.popen semble depassée (deprecated) et il vaut mieux utiliser subprocess :

import subprocess
...
a=subprocess.Popen(["perl", "divfix", "-v", file_1], stdout=subprocess.PIPE)
a.stdout.read()

- Pour l'autoscroll, chez moi ca marche dans ta version 2, avec self.sortiezonedetexte.scroll_to_mark(buffer.get_insert(), 0). (je suis sous archlinux, ca peut peut etre expliquer)

- Pour la progressbar, je n'ai pas de solution miracle. J'ai longtemps cherche pour arriver a faire progresser la barre avec un programme unique en tache de fond, mais sans succes. Dans ton programme, la commande lancée interromp la boucle principale (gtk.main). Je suppose qu'avec un gros fichier video, ca doit faire bloquer la fenetre. La progressbar ne se met a jour qu'une fois l'action terminee. La solution est d'utiliser un autre thread grace au module threading :

import threading
...
gobject.threads_init()                           #Pour que les threads soient lancés au moment opportun.
...
class MonThread(threading.Thread):        #la classe qui creera le thread et lancera la commande
    def __init__(self):
        super(MonThread, self).__init__()    #je sais pas a quoi ca sert, mais ca sert
        self.pid=os.getpid()                       #on recupere le pid, ca peut etre utile
        
    def run(self):                                   #lance par la commande MonThread.start()
        a=subprocess.Popen(["perl", "divfix", "-v", file_1], stdout=subprocess.PIPE)
        a.stdout.read()

class ClassePrincipale()
    .... #fait plein de trucs (initialisation de la fenetre, choix du fichier, ...)


    #quand on clique sur le bouton :
    mon_thread=MonThread()                  #instancie notre thread
    mon_thread.start()                           #demarre l'action
    timer = gobject.timeout_add (100, self.pulsate)    #Fait pulser la barre a intervalles reguliers

    def pulsate(self):                             #fonction pour faire pulser
        if mon_thread.is_alive():               #Tant que le thread est en cours, 
            progress_bar.pulse()                #on fait pulser la barre
            return True                            #et on renvoie True pour que gobject.timeout recommence
        else:
            progress_bar.set_fraction(1)      #si le thread est fini, on met la barre remplie
            progress_bar.set_text('Terminé !')     #on peut meme ecrire termine si on veut
            return False                            #On renvoie False a gobject.timeout pour qu'il s'arrete

Comme tu le remarques, ca ne fait que pulser la barre, ca ne la fait pas progresser. Je n'ai pas de solution pour recuperer la sortie de divfix en temps reel et ajuster la barre en fonction de sa sortie...

Voila, a toi de jouer !

References :
http://www.pygtk.org/pygtk2reference/
http://faq.pygtk.org/index.py?req=index notamment la 23.20