Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 23/02/2010, à 20:34

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

@ magestik ... Merci
Et sinon .. au sujet de optparse  .. qui est vraiment bien ... comment afficher l'ensemble de l'aide au cas ou le script aurrait été lancer sans paramètres ni options ????
avec :

if len(sys.argv[1:])<1:
			Get_ARGV__.error(" pouett pouett")

j'arrive a afficher l'erreur .. mais pas réafficher l'aide .. ça ne me renvoie que l'usage ... et l'erreur ..

Usage:  pyftpdlib_ftp.py [options] [arg]...[options] [arg]...

pyftpdlib_ftp.py: error:  pouett pouett

ps : @ kanor  merci a toi aussi ^^

ps: " Siouplait ^^"

Dernière modification par UUBBUU_USER (Le 23/02/2010, à 20:36)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#27 Le 25/02/2010, à 02:21

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Salut a tous ..; juste pour vous tenir au courant des avancés ..
voila le script du server quasiment fini ..
Je l'avoue cette librairie étant totalement dédié .. c'est assez facile .. :

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

import os
import sys
import optparse
from pyftpdlib import ftpserver

class main__ ():
	
		# simulate command line invocation
		sys.argv = ["pyftpdlib_ftp.py",  "-p",  "10280", "-s", "/home", "-u", "1024", "-d" , "61440" ]
		Get_ARGV__ = optparse.OptionParser(usage='Usage: %prog <options> <arg> ..')
		Get_ARGV__GROUP_CREDIT = optparse.OptionGroup(Get_ARGV__, "CREDIT ", """FTP server base on pyftpdlib
																				  Site Web :http://code.google.com/p/pyftpdlib""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_CREDIT)																		  
		Get_ARGV__GROUP_SERVER = optparse.OptionGroup(Get_ARGV__, "GENERAL OPTIONS", "General FTP Options.")																		  																				  
		Get_ARGV__GROUP_SERVER.add_option("-s", dest="SHARE_DIR", default=os.path.expanduser('~'), help="""Share directory 
																						DefaultValue: USER directory""")
		Get_ARGV__GROUP_SERVER.add_option("-p", dest="PORT_NUMBER", default="21", help="""Server Port Number 
																						DefaultValue: %default""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_SERVER)
		Get_ARGV__GROUP_SPEED = optparse.OptionGroup(Get_ARGV__, "THROTTLED OPTIONS ","""Upload and Download limit 
																						     Exemple : 30720  = 30 Kb/sec (30 x 1024)""")
		Get_ARGV__GROUP_SPEED.add_option("-u", dest="UP_LIMIT", default="30270", help="""UpStream Limit 
																						DefaultValue: %default""")
		Get_ARGV__GROUP_SPEED.add_option("-d", dest="DOWN_LIMIT", default="30270",help="""DownStream Limit 
																						DefaultValue: %default""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_SPEED)
		( options, args ) = Get_ARGV__.parse_args()
		
		if len(sys.argv[1:])<1:
			Get_ARGV__.error(" ")
		
		print	" Server Will be launch With those options : "
		print 	"Share directory :", options.SHARE_DIR
		print 	"Port number :", options.PORT_NUMBER
		print 	"UpStream limit :", options.UP_LIMIT
		print 	"DownStream limit :", options.DOWN_LIMIT
		
		SHARE_DIR = options.SHARE_DIR
		PORT_NUMBER = options.PORT_NUMBER
		UP_LIMIT = options.UP_LIMIT
		DOWN_LIMIT = options.DOWN_LIMIT
		
		USER = "user"
		PASSWORD = "password"
		
		#~ # Instantiate a dummy authorizer for managing 'virtual' users
		authorizer = ftpserver.DummyAuthorizer()
		
		#~ # Define a new user having full r/w permissions
		authorizer.add_user(USER, PASSWORD , SHARE_DIR, perm='elradfmw')
		
		#~ # define an anonymous user with  read-only (comment or uncomment)
		authorizer.add_anonymous(SHARE_DIR)
		
		#~ # define bandwitch limit
		dtp_handler = ftpserver.ThrottledDTPHandler
		dtp_handler.read_limit = UP_LIMIT
		dtp_handler.write_limit = DOWN_LIMIT
		
		#~ # Instantiate FTP handler class
		ftp_handler = ftpserver.FTPHandler
		ftp_handler.authorizer = authorizer
		#~ # have the ftp handler use the alternative dtp handler class
		ftp_handler.dtp_handler = dtp_handler
		
		#~ # Instantiate FTP server class and listen to 0.0.0.0:DEFAULT_PORT
		ftpd = ftpserver.FTPServer(('0.0.0.0', PORT_NUMBER), ftp_handler)
		
		#~ # set a limit for connections
		ftpd.max_cons = 256
		ftpd.max_cons_per_ip = 5
		
		
		
		#~ # start the server
		ftpd.serve_forever()


if __name__ == "__main__":
	 main__()

TODO :
Ajouter ( USER + PASSWORD  .... LIMIT CONNECTIONS ..)
Inserer une fonction de DL et d'install de pyftpdlib  . si non présente sur le système
+ une autre fonction qui envoi des popup pour commenter l'activité du ou des serveurs lancés .. (libnotify)
Configurer une Interface basé sur le superbe travail D'aDcomp .. ( en fonctions des besoins ..)

questions :   
j'ai toujours pas trouvé comment afficher l'aide complète en cas d'erreur .... d'options ou paramètres .. Quelqu'un pourrais -t- il m'aider ???? j'ai bien chercher du coté de optparse .... mais j'ai pas a trouvé ..  ( il y a toujours __doc__ sinon .. mais bon .... )

Dernière modification par UUBBUU_USER (Le 25/02/2010, à 02:32)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#28 Le 25/02/2010, à 20:08

magestik

Re : Aide a la réalisation d'un script Python

Pour l'affichage de l'aide :

if len(sys.argv[1:])<1:
            Get_ARGV__.error(" pouett pouett")
            helpINFO()

Je crois que ta fonction s'apellait helpINFO() ?

Hors ligne

#29 Le 25/02/2010, à 20:39

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

... c'était la fonction pour  lancer

print  __doc__

Mais étant donné que optparse intègre une gestions des erreurs .. je n'en es plus ou moins plus besoin .....
sinon j'ai opté pour cette méthode ...

if len(sys.argv[1:])<1:
			Get_ARGV__.error("Not enought arguments. Try  with  -h  or --help options for more info.")
#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
	import pynotify  # python-notify
	import os
	import sys
	import subprocess
	import commands
	import optparse
	from pyftpdlib import ftpserver
	
except:
	print "Some Packages are missing"
	
	
def my_notify(title,msg):	
	    if pynotify.init("%prog"):
			n = pynotify.Notification(title,msg)
			n.show() # show
			n.set_timeout(5) # sec.. before close
			
		#n.close() # close
		#n.attach_to_widget(widget) # 'self' often works
		# or position it explicitly		
		#n.set_hint("x", x-coordinate)
		#n.set_hint("y", y-coordinate)
		
		#n.set_urgency(pynotify.URGENCY_LOW)
		#n.set_urgency(pynotify.URGENCY_NORMAL)
		#n.set_urgency(pynotify.URGENCY_CRITICAL)

class main__ ():
	
		# simulate command line invocation
		sys.argv = ["pyftpdlib_ftp.py", "-p", "10280"]
		

		Get_ARGV__ = optparse.OptionParser(usage='Usage: %prog <options> <arg> ..')
#---------------------------GROUP OPTION  CREDIT		
		Get_ARGV__GROUP_CREDIT = optparse.OptionGroup(Get_ARGV__, "CREDIT ", """FTP server base on pyftpdlib
																				  Site Web :http://code.google.com/p/pyftpdlib""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_CREDIT)
#---------------------------GROUP OPTION	GENERAL																			  
		Get_ARGV__GROUP_SERVER = optparse.OptionGroup(Get_ARGV__, "GENERAL OPTIONS", "General FTP Options.")																		  																				  
		Get_ARGV__GROUP_SERVER.add_option("-s", dest="SHARE_DIR", default=os.path.expanduser('~'), help="""Share directory 
																						DefaultValue: USER directory""")
		Get_ARGV__GROUP_SERVER.add_option("-p", dest="PORT_NUMBER", default="21", help="""Server Port Number 
																						DefaultValue: %default""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_SERVER)
#---------------------------GROUP OPTION	THROTTLED BANDWITCH	
		Get_ARGV__GROUP_SPEED = optparse.OptionGroup(Get_ARGV__, "THROTTLED OPTIONS ","""Upload and Download limit 
																						     Exemple : 30720  = 30 Kb/sec (30 x 1024)""")
		Get_ARGV__GROUP_SPEED.add_option("-u", dest="UP_LIMIT", default="30270", help="""UpStream Limit 
																						DefaultValue: %default""")
		Get_ARGV__GROUP_SPEED.add_option("-d", dest="DOWN_LIMIT", default="30270",help="""DownStream Limit 
																						DefaultValue: %default""")
		Get_ARGV__.add_option_group(Get_ARGV__GROUP_SPEED)
		
		( options, args ) = Get_ARGV__.parse_args()
		
		if len(sys.argv[1:])<1:
			Get_ARGV__.error("Not enought arguments. Try  with  -h  or --help options for more info.")
		
		print	" Server Will be launch With those options : "
		print 	"Share directory :", options.SHARE_DIR
		print 	"Port number :", options.PORT_NUMBER
		print 	"UpStream limit :", options.UP_LIMIT
		print 	"DownStream limit :", options.DOWN_LIMIT
		
		SHARE_DIR = options.SHARE_DIR
		PORT_NUMBER = options.PORT_NUMBER
		UP_LIMIT = options.UP_LIMIT
		DOWN_LIMIT = options.DOWN_LIMIT
		GET_IP = commands.getoutput('curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"')
		
		TITLE_NOTIFY = " titre "
		MSG_NOTIFY = " message "
		
		#subprocess.call(['notify-send', TITLE_NOTIFY , MSG_NOTIFY])    # libnotify-bin
		my_notify(TITLE_NOTIFY,MSG_NOTIFY) # python-notify
		
		USER = "user"
		PASSWORD = "password"
		
		#~ # Instantiate a dummy authorizer for managing 'virtual' users
		authorizer = ftpserver.DummyAuthorizer()
		
		#~ # Define a new user having full r/w permissions
		authorizer.add_user(USER, PASSWORD , SHARE_DIR, perm='elradfmw')
		
		#~ # define an anonymous user with  read-only (comment or uncomment)
		authorizer.add_anonymous(SHARE_DIR)
		
		#~ # define bandwitch limit
		dtp_handler = ftpserver.ThrottledDTPHandler
		dtp_handler.read_limit = UP_LIMIT
		dtp_handler.write_limit = DOWN_LIMIT
		
		#~ # Instantiate FTP handler class
		ftp_handler = ftpserver.FTPHandler
		ftp_handler.authorizer = authorizer
		#~ # have the ftp handler use the alternative dtp handler class
		ftp_handler.dtp_handler = dtp_handler
		
		#~ # Instantiate FTP server class and listen to 0.0.0.0:DEFAULT_PORT
		ftpd = ftpserver.FTPServer(('0.0.0.0', PORT_NUMBER), ftp_handler)
		
		#~ # set a limit for connections
		ftpd.max_cons = 256
		ftpd.max_cons_per_ip = 5
		
		
		
		#~ # start the server
		ftpd.serve_forever()


if __name__ == "__main__":
	 main__()

Par contre .. je me demande quel paquets chosir  ( pour le système de popup .....  )  libnotify-bin oubien python-notify

Dernière modification par UUBBUU_USER (Le 25/02/2010, à 20:40)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#30 Le 28/02/2010, à 00:46

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Bon .. voila ou j'en suis ... ( j'ai essayer de nettoyer les premiers Posts du  topic ... )
C'est le B........

#!/usr/bin/env python
# -*- coding: utf-8 -*-
try:
	import pynotify  # python-notify
	import os
	import sys
	import subprocess
	import commands
	import optparse
	from pyftpdlib import ftpserver
	import gtk
	
except:
	print("ERROR : All required dependencies were not found!")
	exit()	
	
#~ import commands
#~                                      ####           ===>>>    recuperer le pid 
#~ def process_num(process):
    #~ return commands.getoutput('pidof %s |wc -w' % process)	
##------------------------------------------------------------------------------------------------------------------------------------
####------------VARIABLES GLOBALES----------
APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'

GET_SERVER_IP = commands.getoutput('curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"')

SHARE_DIR = os.path.expanduser('~')
PORT_NUMBER = "8080"
reel_port_number = int(PORT_NUMBER)
UP_LIMIT = "30"
DOWN_LIMIT = "30"

reel_up_limit = int(UP_LIMIT)*1024
reel_dl_limit = int(DOWN_LIMIT)*1024

USER = "user"
PASSWORD = "password"

##------------------------------------------------------------------------------------------------------------------------------------
## True / False ( only for debbuging )
DEBUG=True


##---------------FOnctions pour afficher debug----------------------------------------------------------------------------------------------------------
def logINFO(msg):
    if DEBUG:
        print("%s - %s" % (APP_NAME, msg))
        
        
##------------------------------------------------------------------------------------------------------------------------------------
####------------NOTIFICATIONS-----------
def logNOTIFY(title,msg):	
	    if pynotify.init("%prog"):
			n = pynotify.Notification(title,msg)
			n.show() # show
			n.set_timeout(5) # sec.. before close
					
##------------------------------------------------------------------------------------------------------------------------------------
####-------------EXIT ------------------
def doquit(self, widget=None, data=None):
	logINFO('** doquit ..')
	gtk.main_quit()

##------------------------------------------------------------------------------------------------------------------------------------
##-----------------RUN [ GTK.MAIN()  ]--------------------------------
def run(self):
    logINFO('** run ..')
    gtk.main()	
    
#######################################################################################################################
##------------------------------------------------------------------------------------------------------------------------------------
####-----------MAIN APP  ------------	
class App():
##------------------------------------------------------------------
##----------------------------------INIT-----------------------
##------------------------------------------------------------------
    def __init__(self):

        self.hide_me = False
        self.focus_check = False
        self.mode = None

        self.create_window()
        self.create_menu()
        self.create_statusicon()

        self.toggle_hide()
        gtk.main()
##------------------------------------------------------------------
##---------------------------------window click gauche	------------
##------------------------------------------------------------------               
    def create_window(self):
        logINFO('** create_window ..')
        self.window = gtk.Window()
        self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY)
        #~ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
        self.window.set_title(APP_NAME)
        self.window.set_name("%sWindow" % APP_NAME)
        self.window.stick()
        self.window.set_decorated(False)
        self.window.set_keep_below(False)
        self.window.set_keep_above(True)
        self.window.set_skip_taskbar_hint(True)
        self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)

        ## Only if you want to hide when lost focus
        self.window.connect("focus-out-event", self.lost_focus)

        self.window.connect("key-press-event", self.onkeypress)
        self.window.connect("destroy", doquit)
##------------------------------------------------------------------
##-----------------------------------systray icone	-----------
##------------------------------------------------------------------
    def create_statusicon(self):
        logINFO('** create_statusicon ..')
        self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
        self.statusIcon.set_visible(True)
        self.statusIcon.set_tooltip(APP_NAME)        
        self.statusIcon.connect('popup-menu', self.status_icon_popup)        
        self.statusIcon.connect('activate', self.toggle_hide)        
##------------------------------------------------------------------
##------------------------------click droit POPUP MENU -------------
##------------------------------------------------------------------
    def create_menu(self):
        logINFO('** create_menu ..')
        self.popupMenu = gtk.Menu()
        menuPopup = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
        menuPopup.connect("activate", self.launcher)
        self.popupMenu.add(menuPopup)
        menuPopup = gtk.ImageMenuItem (gtk.STOCK_ABOUT)
        menuPopup.connect("activate", self.show_about_dialog)
        self.popupMenu.add(menuPopup)
        menuPopup = gtk.ImageMenuItem(gtk.STOCK_QUIT)
        menuPopup.connect("activate", doquit)
        self.popupMenu.add(menuPopup)
        self.popupMenu.show_all()
##------------------------------------------------------------------
####------------------------------------DEF EFFETS
##------------------------------------------------------------------
    def show_window(self, mode=None):
        logINFO('** show_window ..')
        screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
        w_width , w_height = self.window.get_size()

        (screen, rect, orientation) = self.statusIcon.get_geometry()
        if rect[0] + w_width > screen_width:
            x = screen_width - w_width
        else:
            x = rect[0] + w_width
        y = rect[1]+rect[3]

        self.window.move(x, y) 
##------------------------------------------------------------------
####---------------------DEF HIDE ME
##------------------------------------------------------------------            
    def toggle_hide(self, widget=None, event=None):        
        if self.hide_me:
            self.hide_me = False
            self.show_window()
            self.window.show()
            self.focus_check = True
        else:
            self.hide_me = True
            self.focus_check = False
            self.window.hide()
            logINFO('** toggle_hide ..')
##------------------------------------------------------------------
####------------------DEF FOCUS 
##------------------------------------------------------------------
    def lost_focus(self, widget, event):
        if self.focus_check:
            self.toggle_hide()
##------------------------------------------------------------------
####--------------------- on key event ????
##------------------------------------------------------------------
    def onkeypress(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.toggle_hide()
##------------------------------------------------------------------
####------------------SHOW MENU CLICK DROIT
##------------------------------------------------------------------
    def status_icon_popup(self, widget, button, time):
		logINFO('** status_icon_popup ..')
		self.popupMenu.popup(None, None, None, 3, time)
##------------------------------------------------------------------
####---------------------ABOUT DIALOG  Menu click droit -------------
##------------------------------------------------------------------
    def show_about_dialog(self, widget, data=None):
        about = gtk.AboutDialog()
        about.set_icon_from_file('monicon2.png')
        about.set_program_name(APP_NAME)
        about.set_version(APP_VERSION)
        #~ about.set_authors(['', ''])
        #~ about.set_logo()
        about.set_website('htt://www.mon_site.com')
        about.set_comments(APP_DESC)
        about.run()
        about.destroy()
        
#######################################################################################################################    
##------------------------------------------------------------------------------------------------------------------------------------
####-----------GTK LAUNCH SERVER------------
    def launcher(self, widget, data=None):
		logINFO('** create window  gtk_launch_server..')
##---------CREATION FENETRE-------------------------------------				
		self.window = gtk.Window()
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)		
		self.window.connect("destroy", doquit)
##---------CONTENU-------------------------------		
		# boite generale
		main_box = gtk.VBox(False,4)				
# titre server
		LABEL_ = gtk.Label()
		LABEL_.set_markup("<b>SERVER</b>")		
# SHARE DIRECTORY
		HBOX_server_dir = gtk.HBox(False, 3)		
		LABEL_DIR = gtk.Label("Share-Dir : ")
		self.server_dir = gtk.Entry()
		self.server_dir.set_text(SHARE_DIR)
		bt_select_dir = gtk.Button("choose Dir")
		bt_select_dir.connect("clicked", self.dir_chooser)		
		HBOX_server_dir.pack_start(LABEL_DIR)
		HBOX_server_dir.pack_start(self.server_dir)
		HBOX_server_dir.pack_end(bt_select_dir)		
# PORT NUMBER
		HBOX_server_port = gtk.HBox(False, 2)
		LABEL_PORT = gtk.Label("Port-Number : ")
		server_port = gtk.Entry()
		server_port.set_text(PORT_NUMBER)
		HBOX_server_port.pack_start(LABEL_PORT)
		HBOX_server_port.pack_start(server_port)				
# UPLOAD LIMIT
		HBOX_upload_limit = gtk.HBox(False, 3)
		LABEL_UPLOAD = gtk.Label("Upload-Limit : ")
		server_upload_limit = gtk.Entry()
		server_upload_limit.set_text(UP_LIMIT)
		HBOX_upload_limit.pack_start(LABEL_UPLOAD)
		HBOX_upload_limit.pack_start(server_upload_limit)	
# DOWNLOAD LIMIT
		HBOX_download_limit = gtk.HBox(False, 3)
		LABEL_DOWNLOAD = gtk.Label("Download-Limit : ")
		server_download_limit = gtk.Entry()
		server_download_limit.set_text(DOWN_LIMIT)
		HBOX_download_limit.pack_start(LABEL_DOWNLOAD)
		HBOX_download_limit.pack_start(server_download_limit)				
# boite boutons
		HBOX_buttons = gtk.HBox(False, 4)
		bt_start_server = gtk.Button("start server")
		bt_start_server.connect("clicked", self.start_server_)
		bt_stop_server = gtk.Button("stop server")
		bt_stop_server.connect("clicked",self.stop_server_)
		bt_close_launcher = gtk.Button("close launcher")
		bt_close_launcher.connect("clicked", self.close_launcher)
		HBOX_buttons.pack_start(bt_start_server)
		HBOX_buttons.pack_start(bt_stop_server)
		HBOX_buttons.pack_start(bt_close_launcher)		
##----------INIT FENETRE------------------------------------------
		main_box.pack_start(LABEL_)
		main_box.pack_start(HBOX_server_dir)
		main_box.pack_start(HBOX_server_port)
		main_box.pack_start(HBOX_upload_limit)
		main_box.pack_start(HBOX_download_limit)
		main_box.pack_start(HBOX_buttons)
		main_box.show_all()
		self.window.add(main_box)
		self.window.show()
	
####------------------------------------DEF CHOOSE DIRECTORY		
    def	dir_chooser(self,widget):
		logINFO('** dir_chooser ..')
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.environ['HOME'])
		if dialogue.run() == gtk.RESPONSE_OK:
			self.server_dir.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
			
####------------------------------------DEF start server
    def start_server_ (self, widget=None, data=None):
		logINFO('** start server ..')
		logNOTIFY(" titre "," message ")
		
		#~ # Instantiate a dummy authorizer for managing 'virtual' users
		authorizer = ftpserver.DummyAuthorizer()
		
		#~ # Define a new user having full r/w permissions
		#authorizer.add_user(USER, PASSWORD , SHARE_DIR, perm='elradfmw')
		
		#~ # define an anonymous user with  read-only (comment or uncomment)
		authorizer.add_anonymous(SHARE_DIR)
		
		#~ # define bandwitch limit
		dtp_handler = ftpserver.ThrottledDTPHandler
		dtp_handler.read_limit = reel_up_limit
		dtp_handler.write_limit = reel_dl_limit
		
		#~ # Instantiate FTP handler class
		ftp_handler = ftpserver.FTPHandler
		ftp_handler.authorizer = authorizer
		#~ # have the ftp handler use the alternative dtp handler class
		ftp_handler.dtp_handler = dtp_handler
	
		#~ # Instantiate FTP server class and listen to 0.0.0.0:DEFAULT_PORT
		ftpd = ftpserver.FTPServer(('0.0.0.0',reel_port_number), ftp_handler)
		
		#~ # set a limit for connections
		ftpd.max_cons = 256
		ftpd.max_cons_per_ip = 5
		
		ftpd.serve_forever()
	
####------------------------------------DEF stop server
    def stop_server_ (self, widget=None, data=None):
		logINFO('** stop server ..')	
####------------------------------------DEF close Launcher
    def close_launcher(self, widget=None, data=None):
		logINFO('** close launcher ..')
		gtk.main_quit()

if __name__ == "__main__":
        app=App()
        app.run()

J'ai opter pour python-notify ^^
Bon .. j'arrive a lancer le serveur .... mais j'arrive pas a le stopper ( ni même fermer le launcher ) .... c'est pas encore ça !!!!  ( d' ou l'absence de fonction !!)
il me reste a lier les paramètres rentrer par l'utilisateur ... et le lancement du server ..
Récupérer le Pid du-dit serveur .. ( et faire le bouton stop serveur )
Définir les messages  qui doivent s'afficher ( comment récupérer l'adresse du client et afficher le truc qu'il dl )
créer une fonction pour afficher l'adresse du server ..
.. Pas mal de TAF en perspective .....

Dernière modification par UUBBUU_USER (Le 28/02/2010, à 02:15)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#31 Le 01/03/2010, à 18:15

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

SAlut All  ...
Merci encore pour ceux qui me lisent .. ou bien qui me suivent )
J'ai relancer la machine ....
( Comme j' apprend en même temps .... repartir de zéro permet de bien assimiler les acquis .. )
d'abords le code :

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#
import commands
import os

try:
	import pynotify
	BOOL_NOTIFY=True
except:
	print('ERROR : Pynotify is missing, notify will be desable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except:
	print('ERROR : You Need To install pyftplib Site Web :http://code.google.com/p/pyftpdlib')
	exit()
	
try:
    import gtk
except:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

#--PROGRAMME
APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'

#--IP SERVEUR
GET_SERVER_IP = commands.getoutput('curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"')

#--VALEUR DEFAULT SERVEUR
SHARE_DIR = os.path.expanduser('~')
PORT_NUMBER = '8080'
UP_LIMIT = '30'
DOWN_LIMIT = '30'
USER = 'user'
PASSWORD = 'password'
MAX_CONNECT_GEN = '5'
MAX_CONNECT_IP = '1'

#--TWICK
DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT():
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART():
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(win):
       logINFO('** closing window ..')
	win.destroy()
	
#---sauvegarder pid               						# .?????????????????????
def logGET_PID():				  				                  #
	pid = os.getpid()             						#  VOIR QUEL EST LA MEILLEURE METHODE
											                           # Pour recup le pid si je lance un server  ( pour fonction stop  server  ou reload )
#---recuperer le  pid             						# .?????????????????
def process_num(process):    									#
    return commands.getoutput('pidof %s |wc -w' % process)		#
																#
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
def logPRINT_ADRESS(serv_ip,port_num):
        logINFO('** printing adress server ..')
	print('ftp://%s:%s' % (serv_ip, port_num))
	
#---notification systeme
def logNOTIFY(title,msg):
        logINFO('** notification ..')
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			n = pynotify.Notification(title,msg)
			n.show() # show
			n.set_timeout(5) # sec.. before close
			
#---server name 			
def logSERVER_NAME():
	#faire fonction avec int qu'on monte ou desscent en fonction du nombre de server lancer
	# et suivant si on a spécifier un nom ou pas de server lors de la creation
	a = 1
	print('%s%s' % ('ServeurName', a))
	# pour remplacer valeur #######text_name_GtkServerLauncher.set_text('serveur name')
	# ligne  125
	
def	dir_chooser(self):
	logINFO('** dir_chooser ..')
	dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
	dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
	dialogue.set_current_folder(os.environ['HOME'])
	if dialogue.run() == gtk.RESPONSE_OK:
		text_dir_GtkServerLauncher.set_text(dialogue.get_current_folder())
		print dialogue.get_current_folder()
		dialogue.destroy()
		
			
def logGtkServerLauncher():
	
#---fenetre launcher---------------------------------------------------------------------------------------
	window_GtkServerLauncher = gtk.Window()
	window_GtkServerLauncher.set_title('Create a Server')
	window_GtkServerLauncher.set_keep_below(False)
	window_GtkServerLauncher.set_keep_above(True)
	window_GtkServerLauncher.set_skip_taskbar_hint(True)
	window_GtkServerLauncher.destroy()
	
#---tableau launcher------------------------------------------------------------------------------------------
	tableau_GtkServerLauncher = gtk.Table(rows=11, columns=5, homogeneous=False)
	tableau_GtkServerLauncher.set_row_spacings(5)
	tableau_GtkServerLauncher.set_col_spacings(5)
	
	##nom du serveur
	bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")
	#bt_name_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
	text_name_GtkServerLauncher = gtk.Entry()
	text_name_GtkServerLauncher.set_text('serveur name')
	#recuperer la valeur du gtk.entry ==>>    valeur = text_name_GtkServerLauncher.get_text()
	text_name_GtkServerLauncher.set_editable(False)
	
	tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		
	## dossier de partage 	
	bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
	
	bt_dir_GtkServerLauncher.connect("clicked", dir_chooser)    ###############  PROBLEME ICI  ( dans la fonction dir_chooser )
	###########################################################################  j'ai une erreur TypeError: dir_chooser() takes no arguments (1 given)
	########################################################################### qui voudrait dire qu'il faut un argument ...
	###################### mais si je mets self oubien widget ça fonctionne mais alors ( pour pouvoir spécifier le text ) j'ai
	#  une erreur de style :
	 #					text_dir_GtkServerLauncher.set_text(dialogue.get_current_folder())
      #							NameError: global name 'text_dir_GtkServerLauncher' is not defined
      #  pour info .. j'ai toujours pas vraiment saisi le truc de l'argument magique self ..
        #  d'ou mes essais sans !!!!

	
	tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
	text_dir_GtkServerLauncher = gtk.Entry()
	text_dir_GtkServerLauncher.set_text(SHARE_DIR)
	text_dir_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
	
	## upload limit
	bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
	#bt_up_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
	text_up_GtkServerLauncher = gtk.Entry()
	text_up_GtkServerLauncher.set_text(UP_LIMIT)
	text_up_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
	
	## download limit
	bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
	#bt_dl_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 5, 6)
	text_dl_GtkServerLauncher = gtk.Entry()
	text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)
	text_dl_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 5, 6)
	
	
	
	
	
	window_GtkServerLauncher.add(tableau_GtkServerLauncher)
	window_GtkServerLauncher.show_all()
	gtk.main()

logGtkServerLauncher()

J'ai quelques soucis  dans mon code ... ( j'ai mis les erreurs, mes questions et mes intérogations de-dans  )
Merci d'avance, pour toutes remarques ... conseils ou bien corrections . ))
ps: petit à petit, l'oiseau fait son nid  !!

Dernière modification par UUBBUU_USER (Le 01/03/2010, à 18:20)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#32 Le 01/03/2010, à 18:46

Kanor

Re : Aide a la réalisation d'un script Python

Vu que tu commence je te conseil de lire ça
http://www.biologeek.com/bonnes-pratiques,conferences,django,python,traduction/bonnes-pratiques-et-astuces-python/

Sinon
pas de except sans une erreur specifier par exemple pour les import il faut mieux avoir quelque chose comme ça

try:
    import pynotify
    BOOL_NOTIFY=True
except ImportError, error_message:
    print('ERROR : Pynotify is missing, notify will be desable')
    BOOL_NOTIFY=False

http://www.siteduzero.com/tutoriel-3-37204-les-exceptions.html

GET_SERVER_IP = commands.getoutput('curl -s http://checkip.dyndns.org/ | grep -o "[[:digit:].]\+"')

ça tu pourais le faire en full python avec urllib

PROBLEME ICI  ( dans la fonction dir_chooser )  j'ai une erreur TypeError: dir_chooser() takes no arguments (1 given) qui voudrait dire qu'il faut un argument ...
 mais si je mets self oubien widget ça fonctionne mais alors ( pour pouvoir spécifier le text ) j'ai une erreur de style :       text_dir_GtkServerLauncher.set_text(dialogue.get_current_folder())
 NameError: global name 'text_dir_GtkServerLauncher' is not defined
pour info .. j'ai toujours pas vraiment saisi le truc de l'argument magique self ..

Alors pour ça ta fonction est lié au signal clicked.
Si tu regarde la doc de gtk
http://library.gnome.org/devel/pygtk/stable/class-gtkbutton.html

"clicked" def callback(button, user_param1, ...)

Donc on vois que le premier argument correspond à ton bouton (ou widget comme tu l'a dit dans ton text). Le self que tu a mis n'a rien à faire ici tu n'a pas crée de classe
Plus d'info au sujet de ça par exemple dans ce très bon pdf
http://www.afpy.org/Members/tarek/initiation-python-3
(c'est pour python 3 mais la majorité fonctionne sur 2.6 )

Pour text_dir_GtkServerLaunche c'est normal que tu a un bug, la variable n'e

xiste pas dans la fonction comme c'est indiqué 
global

name 'text_dir_GtkServerLauncher' is not defined

Voila deux trois remarques en passant

Hors ligne

#33 Le 01/03/2010, à 20:40

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

salut Kanor .. merci  pour ces 2 - 3 remarques .. ça fait toujours plaisir  de voir que l'on est suivi ...
Pour le lien :
http://www.biologeek.com/bonnes-pratiqu … es-python/
Je te remercie  .. je l'avais déja + ou moins consulté .. sans le garder sous la main .
Peut-être faudrait-il que je revoie mes noms de widget  ... ( moi qui pensais que c'était bon .. )

Pour les exceptions ... je t'avouerais que je ne savais pas ...   je vais m'appliquer à les préciser

Par contre pour le tex_dir_GtkServerLauncher j'ai remarqué et compris le bug ... Mais je ne vois pas comment y remédier ...
Sur mon interface qui permet de renseigner les différents paramètres de mon serveur, j'ai mis un gtk.bouton  ( avec le titre) et un gtk.entry  par paramètre et par ligne ..
Lorsque je clicke sur le bouton ... je lance une fonction qui me permets de renseigné le gtk.entry  ( qui lui est "...set_editable(False)" ...J'ai choisi cette méthode pour + de clarté et de simplicité a utilisé ...  Peut-être que l'on ne peut faire ainsi ..
Ou alors peut-on passer en paramètres le gtk.entry ..... ( j'ai pas réussi ... )


allez le code avec les 2 trois corrections ( URLLIB et EXCEPTIONS )

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

import os
import urllib

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

#--PROGRAMME
APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'

#--VALEUR DEFAULT SERVEUR
SHARE_DIR = os.path.expanduser('~')
PORT_NUMBER = '8080'
UP_LIMIT = '30'
DOWN_LIMIT = '30'
USER = 'user'
PASSWORD = 'password'
MAX_CONNECT_GEN = '5'
MAX_CONNECT_IP = '1'
a = "1"    # int utiliser pour le nom du serveur si pas spécifié  ( Variera en fonction du nombre de serveur en route )

#--TWICK
DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT():
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART():
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(win):
	win.destroy()
	
#---sauvegarder pid               								# .?????????????????????
def logGET_PID():				  								#
	pid = os.getpid()             								#  VOIR QUEL EST LA MEILLEURE METHODE
																# pour recupérer le pid si je lance un server
#---recuperer le  pid             								#  pour fonction stop et restart server
def process_num(process):    									# 
    return commands.getoutput('pidof %s |wc -w' % process)		#
																#
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(title,msg):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			n = pynotify.Notification(title,msg)
			n.show() # show
			n.set_timeout(5) # sec.. before close
			
#---server name 			
def logSERVER_NAME():
	#faire fonction avec int qu'on monte ou desscent en fonction du nombre de server lancer
	# et suivant si on a spécifier un nom ou pas de server lors de la creation
	print('%s%s' % ('ServeurName', a))
	# pour remplacer valeur #######text_name_GtkServerLauncher.set_text('serveur name')
	# ligne  125
	
def	dir_chooser(widget):
	logINFO('** dir_chooser ..')
	dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
	dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
	dialogue.set_current_folder(os.environ['HOME'])
	if dialogue.run() == gtk.RESPONSE_OK:
		text_dir_GtkServerLauncher.set_text(dialogue.get_current_folder())
		print dialogue.get_current_folder()
		dialogue.destroy()
		
			
def logGtkServerLauncher():
	
#---fenetre launcher---------------------------------------------------------------------------------------
	window_GtkServerLauncher = gtk.Window()
	window_GtkServerLauncher.set_title('Create a Server')
	window_GtkServerLauncher.set_keep_below(False)
	window_GtkServerLauncher.set_keep_above(True)
	window_GtkServerLauncher.set_skip_taskbar_hint(True)
	window_GtkServerLauncher.destroy()
	
#---tableau launcher------------------------------------------------------------------------------------------
	tableau_GtkServerLauncher = gtk.Table(rows=11, columns=5, homogeneous=False)
	tableau_GtkServerLauncher.set_row_spacings(5)
	tableau_GtkServerLauncher.set_col_spacings(5)
	
	##nom du serveur
	bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")
	#bt_name_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
	text_name_GtkServerLauncher = gtk.Entry()
	text_name_GtkServerLauncher.set_text('serveur name')
	#recuperer la valeur du gtk.entry ==>>    valeur = text_name_GtkServerLauncher.get_text()
	text_name_GtkServerLauncher.set_editable(False)
	
	tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		
	## dossier de partage 	
	bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
	
	bt_dir_GtkServerLauncher.connect("clicked", dir_chooser)    ###############  PROBLEME ICI  ( dans la fonction dir_chooser )
	###########################################################################  j'ai une erreur TypeError: dir_chooser() takes no arguments (1 given)
	########################################################################### qui voudrait dire qu'il faut un argument ...
	###################### mais si je mets self oubien widget ça fonctionne mais alors ( pour pouvoir spécifier le text ) j'ai
	#  une erreur de style :
	 #					text_dir_GtkServerLauncher.set_text(dialogue.get_current_folder())
      #							NameError: global name 'text_dir_GtkServerLauncher' is not defined
      #  pour info .. j'ai toujours pas vraiment saisi le truc de l'argument magique self ..
        #  d'ou mes essais sans !!!!

	
	tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
	text_dir_GtkServerLauncher = gtk.Entry()
	text_dir_GtkServerLauncher.set_text(SHARE_DIR)
	text_dir_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
	
	## upload limit
	bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
	#bt_up_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
	text_up_GtkServerLauncher = gtk.Entry()
	text_up_GtkServerLauncher.set_text(UP_LIMIT)
	text_up_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
	
	## download limit
	bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
	#bt_dl_GtkServerLauncher.connect("clicked",   )
	tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 5, 6)
	text_dl_GtkServerLauncher = gtk.Entry()
	text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)
	text_dl_GtkServerLauncher.set_editable(False)
	tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 5, 6)
	
	
	
	
	
	window_GtkServerLauncher.add(tableau_GtkServerLauncher)
	window_GtkServerLauncher.show_all()
	gtk.main()

logGtkServerLauncher()

ps : petit à petit .. l'Homme Grandit !!

Dernière modification par UUBBUU_USER (Le 01/03/2010, à 20:42)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#34 Le 02/03/2010, à 15:20

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

allez ... merci  A tous ceux qui suivent mes travaux ^^
@ Kanor .. j'ai résolu le problème  pour le gtk.button et la valeur ....
Merci pour tes liens encore une fois .....
Sinon .. ou j'en suis .... ( sur l'interface  ..  )

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

#************************************************************

#---------------------placer fenetre sous l'icone !!!!
#------------------------------------------------------------------
#~ def show_window(self, mode=None):
        #~ logINFO('** show_window ..')
        #~ screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
        #~ w_width , w_height = self.window.get_size()
#~ 
        #~ (screen, rect, orientation) = self.statusIcon.get_geometry()
        #~ if rect[0] + w_width > screen_width:
            #~ x = screen_width - w_width
        #~ else:
            #~ x = rect[0] + w_width
        #~ y = rect[1]+rect[3]

        #~ self.window.move(x, y) 
        
#####################################################################
import os
import urllib

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

#--PROGRAMME
APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'

a = "1"    # int utiliser pour le nom du serveur si pas spécifié  ( Variera en fonction du nombre de serveur en route )

#--TWICK
DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------    

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT(self):
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART():
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(self):
	logINFO('** closing window ..')
	self.destroy()
	
#---sauvegarder pid               								# .?????????????????????
def logGET_PID():				  								#
	pid = os.getpid()             								#  VOIR QUEL EST LA MEILLEURE METHODE
																# pour recupérer le pid si je lance un server
#---recuperer le  pid             								#  pour fonction stop et restart server
def process_num(process):    									# 
    return commands.getoutput('pidof %s |wc -w' % process)		#
																#
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(title,msg):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			n = pynotify.Notification(title,msg)
			n.show() # show
			n.set_timeout(5) # sec.. before close
			# faut encore que je place la  notify sur l'icone dans la barre des taches oubien ...
			#attach_to_status_icon(self.statusIcon) marche pas )
			
#---server name 			
def logSERVER_NAME():
	#faire fonction avec int qu'on monte ou desscent en fonction du nombre de server lancer
	# et suivant si on a spécifier un nom ou pas de server lors de la creation
	print('%s%s' % ('ServeurName', a))
	# pour remplacer valeur #######text_name_GtkServerLauncher.set_text('serveur name')
	# ligne  125
	
#-------------------------------------------------------------------------------------------------------		
#-----------MAIN APP  CLASS-----------------------------------------------------------------------------	
#-------------------------------------------------------------------------------------------------------				
class	App():
	
#******************************************************************************************************		
##---INIT ------------------------------------------------ 	
    def __init__(self):
		
		self.booleen_hide_me = False
		self.booleen_focus_check = False		
		self.mode = None
		
		self.create_main_window()
		self.create_menu_click_droit()
		self.create_systray_icon()
		self.window_toggle_hide()
		gtk.main()
		
#******************************************************************************************************
##---main window------------------------------------------------ 		
    def create_main_window(self):
		logINFO('** create_main_window ..')
		self.window = gtk.Window()
		self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY)
		#self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)
		self.window.stick()
		self.window.set_decorated(False)
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)
		self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
		self.window.connect("focus-out-event", self.window_lost_focus)## Only if you want to hide when lost focus
		self.window.connect("key-press-event", self.window_escape_key_press)## fermer la fenetre lors d'un escape key event
		self.window.connect("destroy", logCLOSE_WINDOW)

#******************************************************************************************************		
##----systray icon	------------------------------------------
    def create_systray_icon(self):
		logINFO('** create_systray_icon ..')
		self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
		self.statusIcon.set_visible(True)
		self.statusIcon.set_tooltip(APP_NAME)
		self.statusIcon.connect('popup-menu', self.systray_popup_click_droit_menu)
		self.statusIcon.connect('activate', self.window_toggle_hide)

#******************************************************************************************************		
##----MENU POPUP click droit  ---------------------------------------
    def create_menu_click_droit(self):
		logINFO('** create_menu_click_droit ..')
		self.popupMenu = gtk.Menu()
		menuPopup = gtk.ImageMenuItem(gtk.STOCK_NEW)
		menuPopup.connect("activate", self.logGtkServerLauncher)
		self.popupMenu.add(menuPopup)
		menuPopup = gtk.ImageMenuItem (gtk.STOCK_ABOUT)
		menuPopup.connect("activate", self.show_about_dialog)
		self.popupMenu.add(menuPopup)
		menuPopup = gtk.ImageMenuItem(gtk.STOCK_QUIT)
		menuPopup.connect("activate", logEXIT)
		self.popupMenu.add(menuPopup)
		self.popupMenu.show_all()

#******************************************************************************************************		
##----SHOW MENU POPUP CLICK DROIT------------------------------------------
    def systray_popup_click_droit_menu(self, widget, button, time):
		logINFO('** systray_popup_click_droit_menu ..')
		self.popupMenu.popup(None, None, None, 0, time)    
		### bizarre ... cette ligne s'affiche ..........  
			
#******************************************************************************************************
##---- Cacher la fenetre ----------------------------------------------------
    def window_toggle_hide(self, widget=None, event=None):
		if self.booleen_hide_me:
			self.booleen_hide_me = False
			#self.show_window()
			self.window.show()
			self.booleen_focus_check = True
			logINFO('** toggle_show ..')
		else:
			self.booleen_hide_me = True
			self.booleen_focus_check = False 
			self.window.hide()
			logINFO('** toggle_hide ..') 
			
#******************************************************************************************************			
##----Focus de la fenetre------------------------------------------------------
    def window_lost_focus(self, widget, event):
		if self.booleen_focus_check:
			self.window_toggle_hide()

#******************************************************************************************************
##----key event escape quand fenetre a focus -------------------------------------------------
    def window_escape_key_press(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.window_toggle_hide()

#******************************************************************************************************
##---ABOUT DIALOG  Menu click droit --------------------------------------------------
    def show_about_dialog(self, widget, data=None):
		about = gtk.AboutDialog()
		about.set_program_name(APP_NAME)
		about.set_version(APP_VERSION)
		about.set_authors(['tadan', 'pouett'])
		#about.set_logo()
		about.set_website('htt://www.mon_site.com')
		about.set_comments(APP_DESC)
		about.run()
		about.destroy() 

#******************************************************************************************************      
##---Fenetre Creer un serveur -------------------------------------------------- 
    def logGtkServerLauncher(self, widget):
#---VALEUR DEFAULT SERVEUR---------------------------------------------------------------------------------------
		SHARE_DIR = os.path.expanduser('~')
		PORT_NUMBER = '8080'
		UP_LIMIT = '30'
		DOWN_LIMIT = '30'
		USER = 'user'
		PASSWORD = 'password'
		MAX_CONNECT_GEN = '5'
		MAX_CONNECT_IP = '1'  
		  
#---fenetre launcher---------------------------------------------------------------------------------------
		window_GtkServerLauncher = gtk.Window()
		window_GtkServerLauncher.set_title('Create a Server')
		window_GtkServerLauncher.set_keep_below(False)
		window_GtkServerLauncher.set_keep_above(True)
		window_GtkServerLauncher.set_skip_taskbar_hint(True)
		window_GtkServerLauncher.connect("destroy", logCLOSE_WINDOW)
		
#---tableau launcher------------------------------------------------------------------------------------------
		tableau_GtkServerLauncher = gtk.Table(rows=20, columns=5, homogeneous=False)
		tableau_GtkServerLauncher.set_row_spacings(5)
		tableau_GtkServerLauncher.set_col_spacings(5)
		##nom du serveur
		bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")		
		tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
		text_name_GtkServerLauncher = gtk.Entry()
		text_name_GtkServerLauncher.set_text('serveur name')
		#recuperer la valeur du gtk.entry ==>>    valeur = text_name_GtkServerLauncher.get_text()
		text_name_GtkServerLauncher.set_editable(False)
		tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		bt_name_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_name_GtkServerLauncher,
		                                 'choose Serveur Name ', 'Use only Letter, number, No Special Char.') 
		## dossier de partage 	
		bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
		tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
		text_dir_GtkServerLauncher = gtk.Entry()
		tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
		text_dir_GtkServerLauncher.set_text(SHARE_DIR)
		bt_dir_GtkServerLauncher.connect("clicked", self.dir_chooser, text_dir_GtkServerLauncher)
		text_dir_GtkServerLauncher.set_editable(False)
		## upload limit
		bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
		tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
		text_up_GtkServerLauncher = gtk.Entry()
		text_up_GtkServerLauncher.set_editable(False)
		text_up_GtkServerLauncher.set_text(UP_LIMIT)
		tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
		bt_up_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_up_GtkServerLauncher,
		                                 'define Upload ', 'Bandwitch limit : Kb/s', True)
		## download limit
		bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
		tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 4, 5)
		text_dl_GtkServerLauncher = gtk.Entry()
		text_dl_GtkServerLauncher.set_editable(False)
		text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)		
		tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 4, 5)
		bt_dl_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_dl_GtkServerLauncher,
		                                 'define Download ', 'Bandwitch limit : Kb/s', True)
		## USER
		bt_user_GtkServerLauncher = gtk.Button("User Name :")
		tableau_GtkServerLauncher.attach(bt_user_GtkServerLauncher, 1, 2, 5, 6)
		text_user_GtkServerLauncher = gtk.Entry()		
		text_user_GtkServerLauncher.set_editable(False)
		text_user_GtkServerLauncher.set_text(USER)
		tableau_GtkServerLauncher.attach(text_user_GtkServerLauncher, 3, 4, 5, 6)
		bt_user_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_user_GtkServerLauncher,
		                                 'define', 'Specify User Name', True)
		## PasWord
		bt_passw_GtkServerLauncher = gtk.Button("User password :")
		tableau_GtkServerLauncher.attach(bt_passw_GtkServerLauncher, 1, 2, 6, 7)
		text_passw_GtkServerLauncher = gtk.Entry()
		text_passw_GtkServerLauncher.set_visibility(False)
		text_passw_GtkServerLauncher.set_editable(False)
		text_passw_GtkServerLauncher.set_text(PASSWORD)
		tableau_GtkServerLauncher.attach(text_passw_GtkServerLauncher, 3, 4, 6, 7)
		bt_passw_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_passw_GtkServerLauncher,
		                                 'define', 'Specify Password', False)						
		## Max Connection 
		bt_max_con_GtkServerLauncher = gtk.Button("Serv. Max. Conn. :")
		tableau_GtkServerLauncher.attach(bt_max_con_GtkServerLauncher, 1, 2, 7, 8)
		text_max_con_GtkServerLauncher = gtk.Entry()		
		text_max_con_GtkServerLauncher.set_editable(False)
		text_max_con_GtkServerLauncher.set_text(MAX_CONNECT_GEN)
		tableau_GtkServerLauncher.attach(text_max_con_GtkServerLauncher, 3, 4, 7, 8)
		bt_max_con_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_GtkServerLauncher,
		                                 'Set Value', 'Server Max. Conn.', True)		
		## Max connection by IP
		bt_max_con_ip_GtkServerLauncher = gtk.Button("Max. Conn. per IP :")
		tableau_GtkServerLauncher.attach(bt_max_con_ip_GtkServerLauncher, 1, 2, 8, 9)
		text_max_con_ip_GtkServerLauncher = gtk.Entry()		
		text_max_con_ip_GtkServerLauncher.set_editable(False)
		text_max_con_ip_GtkServerLauncher.set_text(MAX_CONNECT_IP)
		tableau_GtkServerLauncher.attach(text_max_con_ip_GtkServerLauncher, 3, 4, 8, 9)
		bt_max_con_ip_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_ip_GtkServerLauncher,
		                                 'define', 'Max. Conn. per IP', True)		
		
		
		## barre de Status     ########## il faut rajouter fonction pour afficher tooltips lors de survol ^^
		status_bar_GtkServerLauncher = gtk.Statusbar()
		status_bar_GtkServerLauncher.push(2, 'status bar')
		
#--- VertiCAL BOX  Main !!!  ( pour rentrer tous les elements )
		vbox_main_GtkServerLauncher = gtk.VBox()
		vbox_main_GtkServerLauncher.pack_start(tableau_GtkServerLauncher)
		vbox_main_GtkServerLauncher.pack_start(status_bar_GtkServerLauncher)

		window_GtkServerLauncher.add(vbox_main_GtkServerLauncher)
		window_GtkServerLauncher.show_all()
		
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------		
    def	dir_chooser(self, widget, entry):
		logINFO('** dir_chooser ..')		
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, 
										(gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.path.expanduser('~'))
		if dialogue.run() == gtk.RESPONSE_OK:
			entry.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
		else:
			dialogue.destroy()
			
#******************************************************************************************************
##-----Choisir valeur----------------------------------------------------------------------------
    def	entry_dialog_box(self, widget, entry, titre, description, bool):
		logINFO('** valeur_entry ..')
		dialog_box = gtk.Dialog(titre, None, gtk.DIALOG_MODAL,(gtk.STOCK_OK, 
							gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
		value_entry = gtk.Entry()
		value_entry.set_visibility(bool)
		value_entry.set_text(entry.get_text())
		# Insertion pour affichage des gtk.Entry et gtk.Label dans la boite de dialogue	
		# Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox	 de la classe
		value_description = gtk.Label(description)
		dialog_box.vbox.pack_start(value_description, True, False, 0)
		dialog_box.vbox.pack_start(value_entry, True, False, 0)
		dialog_box.vbox.show_all()
		if dialog_box.run() == gtk.RESPONSE_OK:	
			entry.set_text(value_entry.get_text())
			dialog_box.destroy()	
		else:
			dialog_box.destroy()
					
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------			
					          
if __name__ == "__main__":
	app = App()
	logSTART(app)

Voila ...
Les problèmes qu'il me reste a résoudre:
1) NOTIFICATION trouver le moyen de positionner la notification sous l' icône  systray, et celui de récup les messages du serveur ... ip x vien de se connecter ..... dl ou up de tel fichier ( start  et finish ) possibilité de mettre en mode silence..
2) SERVEUR
trouver le moyen de  lancer le server avec un nom spécifique et récupérer le Pid ....  pour pouvoir
le stopper quand je veux.
créer fonction pour read et write ( pour des users spécifique )  ainsi que une case a cocher dans la fenêtre du lanceur afin de griser ou pas le mode user ou alors activer le read and write ou pas  .. ou alors ... une case pour un mode hanounimous ....
finir la fenêtre principale qui listera tous les servers lancés  et trouver le moyen de mettre l'upload ou le dl en temps réels ..

Ps: petit à  petit  l'homme sort l'eau du puits ...
psbis .. je suis sur que ya d'autre chose ... ( ou alors je vai en trouver ^^  big_smile )

ET toujours merci a ceux qui suivent l'evolution de ceux script .
Ainsi qu'a tout ceux qui contribuent .. par leur commentaires , leur conseils,  ou leur corrections .... .

Dernière modification par UUBBUU_USER (Le 02/03/2010, à 16:35)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#35 Le 06/03/2010, à 18:24

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Salut Tout le monde .....
Pour la suite du programme  .. j'ai trouver comment placer mes Notifications ..
Donc déja ça de réglé  ..
Me concentrant essentiellement  a l'heure actuelle sur le GUI ..
voila ou j'en suis ... 

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

#************************************************************

#---------------------placer fenetre sous l'icone !!!!
#------------------------------------------------------------------
#~ def show_window(self, mode=None):
        #~ logINFO('** show_window ..')
        #~ screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
        #~ w_width , w_height = self.window.get_size()
#~ 
        #~ (screen, rect, orientation) = self.statusIcon.get_geometry()
        #~ if rect[0] + w_width > screen_width:
            #~ x = screen_width - w_width
        #~ 
        
#####################################################################
import os
import urllib

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'

a = "1"    # int utiliser pour le nom du serveur si pas spécifié  ( Variera en fonction du nombre de serveur en route )

DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------    

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT(self):
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART(self):
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(self):
	logINFO('** closing window ..')
	self.destroy()
	
#---sauvegarder pid               								# .?????????????????????
def logGET_PID():				  								#
	pid = os.getpid()             								#  VOIR QUEL EST LA MEILLEURE METHODE
																# pour recupérer le pid si je lance un server
#---recuperer le  pid             								#  pour fonction stop et restart server
def process_num(process):    									# 
    return commands.getoutput('pidof %s |wc -w' % process)		#
																#
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(self, title, msg, icon):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			# rechercher et definir l'emplacement pour la notification
			(screen, rect, orientation) = self.statusIcon.get_geometry()										
			n = pynotify.Notification(title,msg,icon)
			n.set_hint("x", rect[0])
			n.set_hint("y", rect[1])
			n.show() # show
			n.set_timeout(5) # sec.. before close
		
#---server name 			
def logSERVER_NAME():
	#faire fonction avec int qu'on monte ou desscent en fonction du nombre de server lancer
	# et suivant si on a spécifier un nom ou pas de server lors de la creation
	print('%s%s' % ('ServeurName', a))
	# pour remplacer valeur #######text_name_GtkServerLauncher.set_text('serveur name')
	# ligne  125
	
#-------------------------------------------------------------------------------------------------------		
#-----------MAIN APP  CLASS-----------------------------------------------------------------------------	
#-------------------------------------------------------------------------------------------------------				
class	App():
	
#******************************************************************************************************		
##---INIT ------------------------------------------------ 	
    def __init__(self):
		
		self.booleen_hide_me = False
		self.booleen_focus_check = False		
		self.mode = None
		
		self.create_main_window()
		self.create_menu_click_droit()
		self.create_systray_icon()
		self.window_toggle_hide()

		logNOTIFY(self, 'TEST title', ' TEST msg  bla bla blu blu bli bli', gtk.STOCK_QUIT)
		
		
#******************************************************************************************************
##---main window------------------------------------------------ 		
    def create_main_window(self):
		logINFO('** create_main_window ..')
######## fenetre
		self.window = gtk.Window()
		self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
		self.window.set_position(gtk.WIN_POS_CENTER)
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)		
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)				
######## box conteneur pour elements
		window_vbox = gtk.VBox()		
######## MenuBar widget
		self.menu = gtk.MenuBar()	
######## menu file title
		main_menu = gtk.Menu()
		menu_item = gtk.MenuItem('Main')
		menu_item.set_submenu(main_menu)
		self.menu.add(menu_item)
#######	menu file item					
		menu_item = gtk.ImageMenuItem(gtk.STOCK_NEW)
		menu_item.get_children()[0].set_label('New Server')
		menu_item.connect("activate", self.logGtkServerLauncher)
		main_menu.append(menu_item)
		menu_item = gtk.ImageMenuItem(gtk.STOCK_DELETE)
		menu_item.get_children()[0].set_label('Delete Server')
#menu_item.connect("activate", )
		main_menu.append(menu_item)
		menu_item = gtk.SeparatorMenuItem()
		main_menu.append(menu_item)
		menu_item = gtk.ImageMenuItem(gtk.STOCK_CLOSE)
		menu_item.get_children()[0].set_label('Close Window')
		menu_item.connect("activate", self.window_toggle_hide)
		main_menu.append(menu_item)
		menu_item = gtk.ImageMenuItem(gtk.STOCK_QUIT)
		menu_item.get_children()[0].set_label('Exit APP_NAME')
		menu_item.connect("activate", logEXIT)
		main_menu.append(menu_item)			
######## menu edit	title	
		main_menu = gtk.Menu()
		menu_item = gtk.MenuItem('Server')
		menu_item.set_submenu(main_menu)
		self.menu.add(menu_item)
#######	 menu edit item	
		menu_item = gtk.ImageMenuItem(gtk.STOCK_YES)
		menu_item.get_children()[0].set_label('Start Server')
#menu_item.connect("activate", )
		main_menu.append(menu_item)
		menu_item = gtk.ImageMenuItem(gtk.STOCK_NO)
		menu_item.get_children()[0].set_label('Stop Server')
#menu_item.connect("activate", )
		main_menu.append(menu_item)		
######## menu tools	title	
		main_menu = gtk.Menu()
		menu_item = gtk.MenuItem('Tools')	
		menu_item.set_submenu(main_menu)
		self.menu.add(menu_item)
#######	 menu tools item	
		menu_item = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
		menu_item.get_children()[0].set_label('Options')
#menu_item.connect("activate", )
		main_menu.append(menu_item)		
######## menu help title		
		main_menu = gtk.Menu()
		menu_item = gtk.MenuItem('Help')	
		menu_item.set_submenu(main_menu)
		self.menu.add(menu_item)
####### menu help item 
		menu_item = gtk.ImageMenuItem(gtk.STOCK_HELP)
		menu_item.get_children()[0].set_label('Help')
#menu_item.connect("activate", )
		main_menu.append(menu_item)
		menu_item = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
		menu_item.get_children()[0].set_label('About')
		menu_item.connect("activate", self.show_about_dialog)        
		main_menu.append(menu_item)
######## separator		
		separator = gtk.HSeparator()
		window_vbox.pack_start(separator, expand=False)
#######	widget scrolled pour list serveur	
		window_scrolled = gtk.ScrolledWindow()
		window_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
#######	liste server init
		list_store = self.create_model_list()
		self.window_treeview = gtk.TreeView(list_store)
		self.create_treeview_columns(self.window_treeview)
		#window_treeview.connect('row-activated',self.fonction.on_activate(self, window_treeview)
		self.window_treeview.set_rules_hint(True)
		window_scrolled.add(self.window_treeview)

		window_vbox.pack_start(self.menu, expand=False)					
		window_vbox.pack_end(window_scrolled)
		window_vbox.show_all()
		self.window.add(window_vbox)
		
# Redimensionner la fenetre en fonction des differents widgets a l'interieur
# et suivant leur tailles respective
		a, b = self.window_treeview.size_request()
		c, d = self.menu.size_request()
		a = a + c
		b = b + d
		self.window.set_size_request(a, b)

		#self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
		#self.window.connect("focus-out-event", self.window_lost_focus)## Only if you want to hide when lost focus
		#self.window.connect("key-press-event", self.window_escape_key_press)## fermer la fenetre lors d'un escape key event
		self.window.connect("destroy", logCLOSE_WINDOW)




    def CreateTreeViewModel(self):
		self.row_name = '0'
		self.row_dir = '1'
		self.row_port = '2'
		self.row_up = '3'
		self.row_anonym = '4'
		
		self.item_name = 'Name'
		self.item_dir = 'Share Dir'
		self.item_port = 'Port Numb.'
		self.item_up = 'UP(kb/s)'
		self.item_anonym = 'Anonym.'
		
		self.server_view = gtk.TreeView()
		
    		    		
#******************************************************************************************************		
#~ ##----refresh list server	------------------------------------------
    def create_model_list(self):
		#list_store = gtk.ListStore(str, str, int, bool, bool)
		list_store = gtk.ListStore(str, str, str, str, str)
		for item in self.server_list():
			#list_store.append([item[0], item[1], item[2], item[3], item[4]])
			list_store.append([item[0], item[1], item[2], item[3], item[4]])
		return list_store
		#~ logINFO('** MAJ Server List ..')
		#~ self.serv_numb = self.serv_numb + 1
		#~ if self.serv_numb < 2:
			#~ self.serv_list_[self.serv_numb] = (S_name, S_dir, S_up_lmt, S_dl_lmt, S_port, S_bool_rw, S_bool_an)
			#~ list = self.serv_list_[self.serv_numb]
			#~ print([list])
		#~ else:
			#~ self.serv_list_[self.serv.numb] = (S_name, S_dir, S_up_lmt, S_dl_lmt, S_port, S_bool_rw, S_bool_an)
			#~ i = 1
			#~ for i <= self.serv.numb:
			#~ list = [self.serv_list_[i]]
			#~ return list
	
	###   CREER FOCNTION POUR Mettre a jour liste serveur  pour  listview  de la main window
	#http://zetcode.com/tutorials/pygtktutorial/advancedwidgets/
    def server_list(self):
		#list = [('Sname', 'dir.dee', '55', 'False', 'True')]
		list = [('serveur1', '/home/user/', '8080', '30', 'off')]
		return	list

    def create_treeview_columns(self, window_treeview):
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Name', rendererText, text=0)
			column.set_sort_column_id(0)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Destination', rendererText, text=0)
			column.set_sort_column_id(1)
			self.window_treeview.append_column(column)

			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Port', rendererText, text=0)
			column.set_sort_column_id(2)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('UP(kb/s)', rendererText, text=0)
			column.set_sort_column_id(3)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Anonym.', rendererText, text=0)
			column.set_sort_column_id(5)
			self.window_treeview.append_column(column)																							

#******************************************************************************************************		
##----systray icon	------------------------------------------
    def create_systray_icon(self):
		logINFO('** create_systray_icon ..')
		self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
		self.statusIcon.set_visible(True)
		self.statusIcon.set_tooltip(APP_NAME)
		self.statusIcon.connect('popup-menu', self.systray_popup_click_droit_menu)
		self.statusIcon.connect('activate', self.window_toggle_hide)
		
#******************************************************************************************************
##---- Cacher la fenetre ----------------------------------------------------
    def window_toggle_hide(self, widget=None, event=None):
		if self.booleen_hide_me:
			self.booleen_hide_me = False
			#self.show_window()
			self.window.show()
			self.booleen_focus_check = True
			logINFO('** toggle_show ..')
		else:
			self.booleen_hide_me = True
			self.booleen_focus_check = False 
			self.window.hide()
			logINFO('** toggle_hide ..') 
			
#******************************************************************************************************			
##----Focus de la fenetre------------------------------------------------------
    def window_lost_focus(self, widget, event):
		if self.booleen_focus_check:
			self.window_toggle_hide()

#******************************************************************************************************
##----key event escape quand fenetre a focus -------------------------------------------------
    def window_escape_key_press(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.window_toggle_hide()


#******************************************************************************************************		
##----MENU POPUP click droit  ---------------------------------------
    def create_menu_click_droit(self):
		logINFO('** create_menu_click_droit ..')
		self.popupMenu = gtk.Menu()
		menuPopup = gtk.ImageMenuItem(gtk.STOCK_NEW)
		menuPopup.connect("activate", self.logGtkServerLauncher)
		self.popupMenu.add(menuPopup)
		menuPopup = gtk.ImageMenuItem (gtk.STOCK_ABOUT)
		menuPopup.connect("activate", self.show_about_dialog)
		self.popupMenu.add(menuPopup)
		menuPopup = gtk.ImageMenuItem(gtk.STOCK_QUIT)
		menuPopup.connect("activate", logEXIT)
		self.popupMenu.add(menuPopup)
		self.popupMenu.show_all()

#******************************************************************************************************		
##----SHOW MENU POPUP CLICK DROIT------------------------------------------
    def systray_popup_click_droit_menu(self, widget, button, time):
		logINFO('** systray_popup_click_droit_menu ..')
		self.popupMenu.popup(None, None, None, 0, time)    
		### bizarre ... cette ligne s'affiche ..........  
			
#******************************************************************************************************
##---ABOUT DIALOG  Menu click droit --------------------------------------------------
    def show_about_dialog(self, widget, data=None):
		about = gtk.AboutDialog()
		about.set_program_name(APP_NAME)
		about.set_version(APP_VERSION)
		about.set_authors(['tadan', 'pouett'])
		#about.set_logo()
		about.set_website('htt://www.mon_site.com')
		about.set_comments(APP_DESC)
		about.run()
		about.destroy() 

#******************************************************************************************************      
##---Fenetre Creer un serveur -------------------------------------------------- 
    def logGtkServerLauncher(self, widget):
#---VALEUR DEFAULT SERVEUR---------------------------------------------------------------------------------------
		SHARE_DIR = os.path.expanduser('~')
		PORT_NUMBER = '8080'
		UP_LIMIT = '30'
		DOWN_LIMIT = '30'
		USER = 'user'
		PASSWORD = 'password'
		MAX_CONNECT_GEN = '5'
		MAX_CONNECT_IP = '1'  
		  
#---fenetre launcher---------------------------------------------------------------------------------------
		window_GtkServerLauncher = gtk.Window()
		window_GtkServerLauncher.set_title('Create a Server')
		window_GtkServerLauncher.set_keep_below(False)
		window_GtkServerLauncher.set_keep_above(True)
		window_GtkServerLauncher.set_skip_taskbar_hint(True)
		window_GtkServerLauncher.connect("destroy", logCLOSE_WINDOW)
		
#---tableau launcher------------------------------------------------------------------------------------------
		tableau_GtkServerLauncher = gtk.Table(rows=20, columns=5, homogeneous=False)
		tableau_GtkServerLauncher.set_row_spacings(5)
		tableau_GtkServerLauncher.set_col_spacings(5)
		##nom du serveur
		bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")		
		tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
		text_name_GtkServerLauncher = gtk.Entry()
		text_name_GtkServerLauncher.set_text('serveur name')
#-------#recuperer la valeur du gtk.entry ==>>    valeur = text_name_GtkServerLauncher.get_text()
		text_name_GtkServerLauncher.set_editable(False)
		tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		bt_name_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_name_GtkServerLauncher,
		                                 'choose Serveur Name ', 'Use only Letter, number, No Special Char.') 
		## dossier de partage 	
		bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
		tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
		text_dir_GtkServerLauncher = gtk.Entry()
		tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
		text_dir_GtkServerLauncher.set_text(SHARE_DIR)
		bt_dir_GtkServerLauncher.connect("clicked", self.dir_chooser, text_dir_GtkServerLauncher)
		text_dir_GtkServerLauncher.set_editable(False)
		## upload limit
		bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
		tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
		text_up_GtkServerLauncher = gtk.Entry()
		text_up_GtkServerLauncher.set_editable(False)
		text_up_GtkServerLauncher.set_text(UP_LIMIT)
		tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
		bt_up_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_up_GtkServerLauncher,
		                                 'define Upload ', 'Bandwitch limit : Kb/s', True)
		## download limit
		bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
		tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 4, 5)
		text_dl_GtkServerLauncher = gtk.Entry()
		text_dl_GtkServerLauncher.set_editable(False)
		text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)		
		tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 4, 5)
		bt_dl_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_dl_GtkServerLauncher,
		                                 'define Download ', 'Bandwitch limit : Kb/s', True)
		## USER
		bt_user_GtkServerLauncher = gtk.Button("User :")
		tableau_GtkServerLauncher.attach(bt_user_GtkServerLauncher, 1, 2, 5, 6)
		text_user_GtkServerLauncher = gtk.Entry()		
		text_user_GtkServerLauncher.set_editable(False)
		text_user_GtkServerLauncher.set_text(USER)
		tableau_GtkServerLauncher.attach(text_user_GtkServerLauncher, 3, 4, 5, 6)
		bt_user_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_user_GtkServerLauncher,
		                                 'define', 'Specify User Name', True)
		## PasWord
		bt_passw_GtkServerLauncher = gtk.Button("Password :")
		tableau_GtkServerLauncher.attach(bt_passw_GtkServerLauncher, 1, 2, 6, 7)
		text_passw_GtkServerLauncher = gtk.Entry()
		text_passw_GtkServerLauncher.set_visibility(False)
		text_passw_GtkServerLauncher.set_editable(False)
		text_passw_GtkServerLauncher.set_text(PASSWORD)
		tableau_GtkServerLauncher.attach(text_passw_GtkServerLauncher, 3, 4, 6, 7)
		bt_passw_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_passw_GtkServerLauncher,
		                                 'define', 'Specify Password', False)						
		## write acces for user  ( desactiver  dl limit si pas d'acces en write )
		label_check_box_rw_GtkServerLauncher = gtk.Label('User Write privilege')
		tableau_GtkServerLauncher.attach(label_check_box_rw_GtkServerLauncher, 1, 2, 7, 8)
		check_box_rw_GtkServerLauncher = gtk.CheckButton('Yes / No')
#-------#actif = check_button.get_active()  # return true si cocher 
		tableau_GtkServerLauncher.attach(check_box_rw_GtkServerLauncher, 3, 4, 7, 8)
				
		## Max Connection 
		bt_max_con_GtkServerLauncher = gtk.Button("Serv. Max. Connect. :")
		tableau_GtkServerLauncher.attach(bt_max_con_GtkServerLauncher, 1, 2, 8, 9)
		text_max_con_GtkServerLauncher = gtk.Entry()		
		text_max_con_GtkServerLauncher.set_editable(False)
		text_max_con_GtkServerLauncher.set_text(MAX_CONNECT_GEN)
		tableau_GtkServerLauncher.attach(text_max_con_GtkServerLauncher, 3, 4, 8, 9)
		bt_max_con_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_GtkServerLauncher,
		                                 'Set Value', 'Max. Numb. Connect. /Server ', True)		
		## Max connection by IP
		bt_max_con_ip_GtkServerLauncher = gtk.Button("Max. Connect. per IP :")
		tableau_GtkServerLauncher.attach(bt_max_con_ip_GtkServerLauncher, 1, 2, 9, 10)
		text_max_con_ip_GtkServerLauncher = gtk.Entry()		
		text_max_con_ip_GtkServerLauncher.set_editable(False)
		text_max_con_ip_GtkServerLauncher.set_text(MAX_CONNECT_IP)
		tableau_GtkServerLauncher.attach(text_max_con_ip_GtkServerLauncher, 3, 4, 9, 10)
		bt_max_con_ip_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_ip_GtkServerLauncher,
		                                 'define', 'Max. Numb. Connect. per IP /Server ', True)		
		## activer le mode anonymous
		label_check_box_an_GtkServerLauncher = gtk.Label('Anonymous Mode')
		tableau_GtkServerLauncher.attach(label_check_box_an_GtkServerLauncher, 1, 2, 10, 11)
		check_box_an_GtkServerLauncher = gtk.CheckButton('On / Off')
		tableau_GtkServerLauncher.attach(check_box_an_GtkServerLauncher, 3, 4, 10, 11)
		
		
		
		## barre de Status     ########## il faut rajouter fonction pour afficher tooltips lors de survol ^^
		status_bar_GtkServerLauncher = gtk.Statusbar()
		status_bar_GtkServerLauncher.push(2, 'status bar')
		
#--- VertiCAL BOX  Main !!!  ( pour rentrer tous les elements )
		vbox_main_GtkServerLauncher = gtk.VBox()
		vbox_main_GtkServerLauncher.pack_start(tableau_GtkServerLauncher)
		vbox_main_GtkServerLauncher.pack_start(status_bar_GtkServerLauncher)

		window_GtkServerLauncher.add(vbox_main_GtkServerLauncher)
		window_GtkServerLauncher.show_all()
		
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------		
    def	dir_chooser(self, widget, entry):
		logINFO('** dir_chooser ..')		
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, 
										(gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.path.expanduser('~'))
		if dialogue.run() == gtk.RESPONSE_OK:
			entry.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
		else:
			dialogue.destroy()
			
#******************************************************************************************************
##-----Choisir valeur----------------------------------------------------------------------------
    def	entry_dialog_box(self, widget, entry, titre, description, bool):
		logINFO('** valeur_entry ..')
		dialog_box = gtk.Dialog(titre, None, gtk.DIALOG_MODAL,(gtk.STOCK_OK, 
							gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
		value_entry = gtk.Entry()
		value_entry.set_visibility(bool)
		value_entry.set_text(entry.get_text())
		# Insertion pour affichage des gtk.Entry et gtk.Label dans la boite de dialogue	
		# Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox	 de la classe (self )
		value_description = gtk.Label(description)
		dialog_box.vbox.pack_start(value_description, True, False, 0)
		dialog_box.vbox.pack_start(value_entry, True, False, 0)
		dialog_box.vbox.show_all()
		if dialog_box.run() == gtk.RESPONSE_OK:	
			entry.set_text(value_entry.get_text())
			dialog_box.destroy()	
		else:
			dialog_box.destroy()
					
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------			
					          
if __name__ == "__main__":
	app = App()
	logSTART(app)

La j'essaye avec difficulté de créer une fonction qui renvoi une liste dans mon treeview dans la fenêtre  principale .. la c'est que j'ai qui marche  a moité

..................
#######	widget scrolled pour list serveur	
		window_scrolled = gtk.ScrolledWindow()
		window_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
#######	liste server init
		list_store = self.create_model_list()
		self.window_treeview = gtk.TreeView(list_store)
		self.create_treeview_columns(self.window_treeview)
....
		self.window_treeview.set_rules_hint(True)
		window_scrolled.add(self.window_treeview)
.....
def create_model_list(self):
		list_store = gtk.ListStore(str, str, str, str, str)
		for item in self.server_list():
			list_store.append([item[0], item[1], item[2], item[3], item[4]])
		return list_store
    def server_list(self):
		#list = [('Sname', 'dir.dee', '55', 'False', 'True')]
		list = [('serveur1', '/home/user/', '8080', '30', 'off')]
		return	list
    def create_treeview_columns(self, window_treeview):
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Name', rendererText, text=0)
			column.set_sort_column_id(0)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Destination', rendererText, text=0)
			column.set_sort_column_id(1)
			self.window_treeview.append_column(column)

			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Port', rendererText, text=0)
			column.set_sort_column_id(2)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('UP(kb/s)', rendererText, text=0)
			column.set_sort_column_id(3)
			self.window_treeview.append_column(column)
			
			rendererText = gtk.CellRendererText()
			column = gtk.TreeViewColumn('Anonym.', rendererText, text=0)
			column.set_sort_column_id(5)
			self.window_treeview.append_column(column)

En gros j'affiche bien les titres de chaque colonne ... mais je n'ai que le  premier élément de ma liste dans chaque colonne  .....
Sinon ..  faudrait que je reprenne çela ...Déja pour réparer l'erreur ( pour obtenir la liste complète dans chaque colonne .. et Créer  une fonction qui  renvoie une liste  et qui puisse être augmenter ou diminuer a la volé ....
Ce que je suis en train d'essayer de faire içi ..... mais dur dur ^^

    def CreateTreeViewModel(self):
		self.row_name = '0'
		self.row_dir = '1'
		self.row_port = '2'
		self.row_up = '3'
		self.row_anonym = '4'
		
		self.item_name = 'Name'
		self.item_dir = 'Share Dir'
		self.item_port = 'Port Numb.'
		self.item_up = 'UP(kb/s)'
		self.item_anonym = 'Anonym.'
		
		self.server_view = gtk.TreeView()

ps petit a petit ..   les cheveux blanc ont surgient ^^
ET toujours merci a ceux qui suivent l'evolution de ceux script .
Ainsi qu'a tout ceux qui contribuent .. par leur commentaires , leur conseils,  ou leur corrections .... .


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#36 Le 10/03/2010, à 12:33

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Snif .... jme sent seul .... peut-être que le titre du topic est pas si Top .....
Ou alors je me démerde pas mal ^^^
allez pour tout ceux qui suivent .... voila ou j'en suis ....
toujours pour l'interface :

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

#************************************************************

#---------------------placer fenetre sous l'icone !!!!
#------------------------------------------------------------------
#~ def show_window(self, mode=None):
        #~ logINFO('** show_window ..')
        #~ screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
        #~ w_width , w_height = self.window.get_size()
#~ 
        #~ (screen, rect, orientation) = self.statusIcon.get_geometry()
        #~ if rect[0] + w_width > screen_width:
            #~ x = screen_width - w_width
        #~ 
        
#####################################################################
try:	
    import os
    import urllib
    import subprocess
except ImportError:
	print('''ERROR :  Some Modules Are Missing  !!!
	  ...... Exit ...... ''')
	exit()
	

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'


DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------    

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT(self):
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART(self):
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(self):
	logINFO('** closing window ..')
	self.destroy()
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(self, title, msg, icon):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			# rechercher et definir l'emplacement pour la notification
			(screen, rect, orientation) = self.statusIcon.get_geometry()										
			n = pynotify.Notification(title,msg,icon)
			n.set_hint("x", rect[0])
			n.set_hint("y", rect[1])
			n.show() # show
			n.set_timeout(5) # sec.. before close
	
#-------------------------------------------------------------------------------------------------------		
#-----------MAIN APP  CLASS-----------------------------------------------------------------------------	
#-------------------------------------------------------------------------------------------------------				
class	App():
	
#******************************************************************************************************		
##---INIT ------------------------------------------------ 	
    def __init__(self):
		
		self.booleen_hide_me = False
		self.booleen_focus_check = False		
		self.mode = None
		
		self.create_main_window()
		self.create_menu_click_droit()
		self.create_systray_icon()
		self.window_toggle_hide()

		logNOTIFY(self, 'TEST title', ' TEST msg  bla bla blu blu bli bli', gtk.STOCK_QUIT)
				
#******************************************************************************************************
##---main window------------------------------------------------ 		
    def create_main_window(self):
		logINFO('** create_main_window ..')
######## fenetre
		self.window = gtk.Window()
		self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
		self.window.set_position(gtk.WIN_POS_CENTER)
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)		
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)				
######## box conteneur pour elements
		window_vbox = gtk.VBox()
######## MenuBar widget
		self.menu = gtk.MenuBar()	
		
		main_menu = gtk.Menu()		
		self.menuAddItem(main_menu, 1, 'Main', None, None)
		self.menuAddItem(main_menu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		#self.menuAddItem(main_menu, 0, 'Delete Server', gtk.STOCK_DELETE, mettre action)
		menu_item = gtk.SeparatorMenuItem()
		main_menu.append(menu_item)		
		self.menuAddItem(main_menu, 0, 'Close Window', gtk.STOCK_CLOSE, self.window_toggle_hide)
		self.menuAddItem(main_menu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		
		server_menu = gtk.Menu()
		self.menuAddItem(server_menu, 1, 'Server', None, None)		
		#self.menuAddItem(server_menu, 0, 'Start Server', gtk.STOCK_YES, mettre action )
		#self.menuAddItem(server_menu, 0, 'Stop Server', gtk.STOCK_NO, mettre action )
		
		tools_menu = gtk.Menu()		
		self.menuAddItem(tools_menu, 1, 'Tools', None, None)
		#self.menuAddItem(tools_menu, 0, 'Options', gtk.STOCK_PREFERENCES, mettre action )
		
		help_menu = gtk.Menu()
		self.menuAddItem(help_menu, 1, 'Help', None, None)
		#self.menuAddItem(help_menu, 0, 'Help', gtk.STOCK_HELP, mettre action )
		self.menuAddItem(help_menu, 0, 'About', gtk.STOCK_ABOUT, self.show_about_dialog)
				
######## separator		
		separator = gtk.HSeparator()
		window_vbox.pack_start(separator, expand=False)
		
#######	widget scrolled pour list serveur	
		window_scrolled = gtk.ScrolledWindow()
		window_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		
#######	liste server init		
		logINFO('** function create main treeview ..')
		self.server_view = gtk.TreeView()
		self.server_view.set_rules_hint(True)
		
		treeSelection = self.server_view.get_selection()
		treeSelection.set_mode(gtk.SELECTION_SINGLE)		
		#self.server_view.connect("row-activated", self.onActivated)
				
		self.addTreeViewColumn('PID', 0)
		self.addTreeViewColumn('Name', 1)		
		self.addTreeViewColumn('Share Directory', 2)
		self.addTreeViewColumn('Port Number', 3)
		self.addTreeViewColumn('User', 3)
		self.addTreeViewColumn('Anonym.', 4)				
		self.addTreeViewColumn('Upload(kb/s)', 5)		
		self.addTreeViewColumn('Download(kb/s)', 6)			
		
		self.server_list__ = gtk.ListStore(int, str, str, int, bool, bool, int, int)
		self.server_view.set_model(self.server_list__)

		window_scrolled.add(self.server_view)

		window_vbox.pack_start(self.menu, expand=False)					
		window_vbox.pack_end(window_scrolled)
		window_vbox.show_all()
		self.window.add(window_vbox)
		
# Redimensionner la fenetre en fonction des differents widgets a l'interieur
# et suivant leur tailles respective
		a, b = self.server_view.size_request()
		c, d = self.menu.size_request()
		a = a + c
		b = b + d
		self.window.set_size_request(a, b)

		#self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
		#self.window.connect("focus-out-event", self.window_lost_focus)## Only if you want to hide when lost focus
		#self.window.connect("key-press-event", self.window_escape_key_press)## fermer la fenetre lors d'un escape key event
		self.window.connect("destroy", logCLOSE_WINDOW)

#******************************************************************************************************
##---- creer MEnu ----------------------------------------------------
    def menuAddItem(self, menu, int, titre, stock, action):
		if int == 1 :
			#logINFO('** function add main menu ..')
			menu_item = gtk.MenuItem(titre)
			menu_item.set_submenu(menu)
			self.menu.add(menu_item)
		else:
			#logINFO('** function add item menu ..')
			menu_item = gtk.ImageMenuItem(stock)
			menu_item.get_children()[0].set_label(titre)
			menu_item.connect("activate", action)
			menu.append(menu_item)
			
#******************************************************************************************************
##---- add colonne to treeview ----------------------------------------------------
    def addTreeViewColumn(self, titre, columnId):
		#logINFO('** function add treeview ..')
		column = gtk.TreeViewColumn(titre, gtk.CellRendererText(), text=columnId)
		column.set_resizable(True)
		column.set_sort_column_id(columnId)
		self.server_view.append_column(column)
		
#******************************************************************************************************        
##----systray icon    ------------------------------------------
    def create_systray_icon(self):
        logINFO('** create_systray_icon ..')
        self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
        self.statusIcon.set_visible(True)
        self.statusIcon.set_tooltip(APP_NAME)
        self.statusIcon.connect('popup-menu', self.systray_popup_click_droit_menu)
        self.statusIcon.connect('activate', self.window_toggle_hide)
 			    
#******************************************************************************************************
##---- Cacher la fenetre ----------------------------------------------------
    def window_toggle_hide(self, widget=None, event=None):
		if self.booleen_hide_me:
			self.booleen_hide_me = False
			#self.show_window()
			self.window.show()
			self.booleen_focus_check = True
			logINFO('** toggle_show ..')
		else:
			self.booleen_hide_me = True
			self.booleen_focus_check = False 
			self.window.hide()
			logINFO('** toggle_hide ..') 
			
#******************************************************************************************************			
##----Focus de la fenetre------------------------------------------------------
    def window_lost_focus(self, widget, event):
		if self.booleen_focus_check:
			self.window_toggle_hide()

#******************************************************************************************************
##----key event escape quand fenetre a focus -------------------------------------------------
    def window_escape_key_press(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.window_toggle_hide()

#******************************************************************************************************		
##----MENU POPUP click droit  ---------------------------------------
    def create_menu_click_droit(self):
		logINFO('** create_menu_click_droit ..')
		self.popupMenu = gtk.Menu()
		self.menuAddItem(self.popupMenu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		self.menuAddItem(self.popupMenu, 0, 'About', gtk.STOCK_ABOUT, self.show_about_dialog)
		self.menuAddItem(self.popupMenu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		self.popupMenu.show_all()
		
#******************************************************************************************************		
##----SHOW MENU POPUP CLICK DROIT------------------------------------------
    def systray_popup_click_droit_menu(self, widget, button, time):
		logINFO('** systray_popup_click_droit_menu ..')
		self.popupMenu.popup(None, None, None, 0, time)    
		### bizarre ... cette ligne s'affiche ..........  
			
#******************************************************************************************************
##---ABOUT DIALOG  Menu click droit --------------------------------------------------
    def show_about_dialog(self, widget, data=None):
		about = gtk.AboutDialog()
		about.set_program_name(APP_NAME)
		about.set_version(APP_VERSION)
		about.set_authors(['tadan', 'pouett'])
		#about.set_logo()
		about.set_website('htt://www.mon_site.com')
		about.set_comments(APP_DESC)
		about.run()
		about.destroy() 

#******************************************************************************************************      
##---Fenetre Creer un serveur -------------------------------------------------- 
    def logGtkServerLauncher(self, widget):
#---VALEUR DEFAULT SERVEUR---------------------------------------------------------------------------------------
		SHARE_DIR = os.path.expanduser('~')
		PORT_NUMBER = '8080'
		UP_LIMIT = '30'
		DOWN_LIMIT = '30'
		USER = 'user'
		PASSWORD = 'password'
		MAX_CONNECT_GEN = '5'
		MAX_CONNECT_IP = '1'  
		  
#---fenetre launcher---------------------------------------------------------------------------------------
		window_GtkServerLauncher = gtk.Window()
		window_GtkServerLauncher.set_title('Create a Server')
		window_GtkServerLauncher.set_keep_below(False)
		window_GtkServerLauncher.set_keep_above(True)
		window_GtkServerLauncher.set_skip_taskbar_hint(True)
		window_GtkServerLauncher.connect("destroy", logCLOSE_WINDOW)
		
#---tableau launcher------------------------------------------------------------------------------------------
		tableau_GtkServerLauncher = gtk.Table(rows=20, columns=5, homogeneous=False)
		tableau_GtkServerLauncher.set_row_spacings(5)
		tableau_GtkServerLauncher.set_col_spacings(5)
		
		##nom du serveur
		bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")		
		tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
		text_name_GtkServerLauncher = gtk.Entry()
		text_name_GtkServerLauncher.set_text('serveur name')
		text_name_GtkServerLauncher.set_editable(False)
		tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		bt_name_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_name_GtkServerLauncher,
		                                 'choose Serveur Name ', 'Use only Letter, number, No Special Char.', True) 
		## dossier de partage 	
		bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
		tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
		text_dir_GtkServerLauncher = gtk.Entry()
		tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
		text_dir_GtkServerLauncher.set_text(SHARE_DIR)
		bt_dir_GtkServerLauncher.connect("clicked", self.dir_chooser, text_dir_GtkServerLauncher)
		text_dir_GtkServerLauncher.set_editable(False)
		## upload limit
		bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
		tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
		text_up_GtkServerLauncher = gtk.Entry()
		text_up_GtkServerLauncher.set_editable(False)
		text_up_GtkServerLauncher.set_text(UP_LIMIT)
		tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
		bt_up_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_up_GtkServerLauncher,
		                                 'define Upload ', 'Bandwitch limit : Kb/s', True)
		## download limit
		bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
		tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 4, 5)
		text_dl_GtkServerLauncher = gtk.Entry()
		text_dl_GtkServerLauncher.set_editable(False)
		text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)		
		tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 4, 5)
		bt_dl_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_dl_GtkServerLauncher,
		                                 'define Download ', 'Bandwitch limit : Kb/s', True)
		## USER
		bt_user_GtkServerLauncher = gtk.Button("User :")
		tableau_GtkServerLauncher.attach(bt_user_GtkServerLauncher, 1, 2, 5, 6)
		text_user_GtkServerLauncher = gtk.Entry()		
		text_user_GtkServerLauncher.set_editable(False)
		text_user_GtkServerLauncher.set_text(USER)
		tableau_GtkServerLauncher.attach(text_user_GtkServerLauncher, 3, 4, 5, 6)
		bt_user_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_user_GtkServerLauncher,
		                                 'define', 'Specify User Name', True)
		## PasWord
		bt_passw_GtkServerLauncher = gtk.Button("Password :")
		tableau_GtkServerLauncher.attach(bt_passw_GtkServerLauncher, 1, 2, 6, 7)
		text_passw_GtkServerLauncher = gtk.Entry()
		text_passw_GtkServerLauncher.set_visibility(False)
		text_passw_GtkServerLauncher.set_editable(False)
		text_passw_GtkServerLauncher.set_text(PASSWORD)
		tableau_GtkServerLauncher.attach(text_passw_GtkServerLauncher, 3, 4, 6, 7)
		bt_passw_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_passw_GtkServerLauncher,
		                                 'define', 'Specify Password', False)						
		## write acces for user  ( desactiver  dl limit si pas d'acces en write )
		label_check_box_rw_GtkServerLauncher = gtk.Label('User Write privilege')
		tableau_GtkServerLauncher.attach(label_check_box_rw_GtkServerLauncher, 1, 2, 7, 8)
		check_box_rw_GtkServerLauncher = gtk.CheckButton('Yes / No')
#-------#actif = check_button.get_active()  # return true si cocher 
		tableau_GtkServerLauncher.attach(check_box_rw_GtkServerLauncher, 3, 4, 7, 8)
				
		## Max Connection 
		bt_max_con_GtkServerLauncher = gtk.Button("Serv. Max. Connect. :")
		tableau_GtkServerLauncher.attach(bt_max_con_GtkServerLauncher, 1, 2, 8, 9)
		text_max_con_GtkServerLauncher = gtk.Entry()		
		text_max_con_GtkServerLauncher.set_editable(False)
		text_max_con_GtkServerLauncher.set_text(MAX_CONNECT_GEN)
		tableau_GtkServerLauncher.attach(text_max_con_GtkServerLauncher, 3, 4, 8, 9)
		bt_max_con_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_GtkServerLauncher,
		                                 'Set Value', 'Max. Numb. Connect. /Server ', True)		
		## Max connection by IP
		bt_max_con_ip_GtkServerLauncher = gtk.Button("Max. Connect. per IP :")
		tableau_GtkServerLauncher.attach(bt_max_con_ip_GtkServerLauncher, 1, 2, 9, 10)
		text_max_con_ip_GtkServerLauncher = gtk.Entry()		
		text_max_con_ip_GtkServerLauncher.set_editable(False)
		text_max_con_ip_GtkServerLauncher.set_text(MAX_CONNECT_IP)
		tableau_GtkServerLauncher.attach(text_max_con_ip_GtkServerLauncher, 3, 4, 9, 10)
		bt_max_con_ip_GtkServerLauncher.connect("clicked", self.entry_dialog_box, text_max_con_ip_GtkServerLauncher,
		                                 'define', 'Max. Numb. Connect. per IP /Server ', True)		
		## activer le mode anonymous
		label_check_box_an_GtkServerLauncher = gtk.Label('Anonymous Mode')
		tableau_GtkServerLauncher.attach(label_check_box_an_GtkServerLauncher, 1, 2, 10, 11)
		check_box_an_GtkServerLauncher = gtk.CheckButton('On / Off')
		tableau_GtkServerLauncher.attach(check_box_an_GtkServerLauncher, 3, 4, 10, 11)
		
		## Boite Bouton
		bt_box = gtk.HBox(False, 4)
		bt_start = gtk.Button(stock=gtk.STOCK_SAVE)
		bt_start.connect("clicked", self.startServer('xterm'))
		bt_box.add(bt_start)

		## barre de Status     ########## il faut rajouter fonction pour afficher tooltips lors de survol ^^
		status_bar_GtkServerLauncher = gtk.Statusbar()
		status_bar_GtkServerLauncher.push(2, 'status bar')
		
#--- VertiCAL BOX  Main !!!  ( pour rentrer tous les elements )
		vbox_main_GtkServerLauncher = gtk.VBox()
		vbox_main_GtkServerLauncher.pack_start(tableau_GtkServerLauncher)
		vbox_main_GtkServerLauncher.pack_start(bt_box)
		vbox_main_GtkServerLauncher.pack_start(status_bar_GtkServerLauncher)

		window_GtkServerLauncher.add(vbox_main_GtkServerLauncher)
		window_GtkServerLauncher.show_all()
		
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------		
    def	dir_chooser(self, widget, entry):
		logINFO('** dir_chooser ..')		
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, 
										(gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.path.expanduser('~'))
		if dialogue.run() == gtk.RESPONSE_OK:
			entry.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
		else:
			dialogue.destroy()
			
#******************************************************************************************************
##-----Choisir valeur----------------------------------------------------------------------------
    def	entry_dialog_box(self, widget, entry, titre, description, bool):
		logINFO('** valeur_entry ..')
		dialog_box = gtk.Dialog(titre, None, gtk.DIALOG_MODAL,(gtk.STOCK_OK, 
							gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
		value_entry = gtk.Entry()
		value_entry.set_visibility(bool)
		value_entry.set_text(entry.get_text())
		# Insertion pour affichage des gtk.Entry et gtk.Label dans la boite de dialogue	
		# Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox	 de la classe (self )
		value_description = gtk.Label(description)
		dialog_box.vbox.pack_start(value_description, True, False, 0)
		dialog_box.vbox.pack_start(value_entry, True, False, 0)
		dialog_box.vbox.show_all()
		if dialog_box.run() == gtk.RESPONSE_OK:	
			entry.set_text(value_entry.get_text())
			dialog_box.destroy()	
		else:
			dialog_box.destroy()
					
#******************************************************************************************************
##-----add Serveur to gtktreeview----------------------------------------------------------------------------			
    def addServerToList(self, pidNumb, name, dir, port, bool1, bool2, up, dl):
		self.server_list__.append([pidNumb, name, dir, port, bool1,  bool2, up, dl])
		
#******************************************************************************************************
##-----rm Serveur tfrom gtktreeview----------------------------------------------------------------------------				
    def rmServerToList(self, titer):
		self.server_list__.remove(titer)
		
#******************************************************************************************************
##---- lors d'un click sur item treeview----------------------------------------------------------------------------				
    def onActivated(self, widget, row, col):
		logINFO('*** activated row: %s  col: %s' % (row, col))
		
#******************************************************************************************************
##---- Start du server  + recup du pid ---------------------------------------------------------------------------		
    def startServer(self, cmd):
		process_one = subprocess.Popen([cmd])
		logINFO('*** PID number ::: %s ' % (process_one.pid))
		self.addServerToList( process_one.pid, 'patate', '/dir/der/der/Der', 20, False, True, 30, 30)
		self.window_GtkServerLauncher.destroy()
				          
if __name__ == "__main__":
	app = App()
	logSTART(app)

ps : Donc si jamais ya des amateurs pour tester ... les remarques ou tout autres conseils ou même corrections sont les bienvenu !!!!
Et toujours merci  !!!!
ps biss .... petit a petit  .. je sors de mon lit )


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#37 Le 13/03/2010, à 18:13

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

SAlut ^^
Allez .. Aprés avoir 'ai simplifié l'ajout de menu via un fonction .....
jvai tenter de simplifier  l'ajout d'item dans  ma table via une fonction ...

		##nom du serveur
		bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")		
		tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
		text_name_GtkServerLauncher = gtk.Entry()
		text_name_GtkServerLauncher.set_text('serveur name')
		text_name_GtkServerLauncher.set_editable(False)
		tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		bt_name_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_name_GtkServerLauncher,
		                                 'choose Serveur Name ', 'Use only Letter, number, No Special Char.', True) 
		## dossier de partage 	
		bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
		tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
		text_dir_GtkServerLauncher = gtk.Entry()
		tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
		text_dir_GtkServerLauncher.set_text(SHARE_DIR)
		bt_dir_GtkServerLauncher.connect("clicked", self.dir_chooser, text_dir_GtkServerLauncher)
		text_dir_GtkServerLauncher.set_editable(False)

je posterai mes Résultat ))
ps : petit a petit .. je me sens de plus en plus seul ... Personne ne suit ?????
Ou même  n'émets de remarque, critique  ou conseil ... ou même Encouragement ??


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#38 Le 13/03/2010, à 19:13

Kanor

Re : Aide a la réalisation d'un script Python

Ok tu veux des retours
Alors pour installer ta librairie tu peux demander de l'installer comme ça

sudo easy_install pyftpdlib

Dans le dernier code, je ne vois pas l'interface il semble qu'il manque la ligne
self.window.show() à la fin de la méthode __init__

Dans la methode logGtkServerLauncher tu doit remplacer
window_GtkServerLauncher par self.window_GtkServerLauncher
si tu ne veux pas que tes autre méthode ne plante
De plus tu dois remplacer la ligne
bt_start.connect("clicked", self.startServer('xterm')
par
bt_start.connect("clicked", self.startServer)
et donc modifier la méthode comme ça

def startServer(self,widget):
        process_one = subprocess.Popen(['xterm'])
        logINFO('*** PID number ::: %s ' % (process_one.pid))
        self.addServerToList( process_one.pid, 'patate', '/dir/der/der/Der', 20, False, True, 30, 30)
        self.window_GtkServerLauncher.destroy()

Bon cette fonction ne fait quant même pas son boulot

En autre élément embétant c'est que la fenétre reste toujours en avant il doit avoir un prb dans la conf

Voila quelque remonté wink

Hors ligne

#39 Le 13/03/2010, à 20:50

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

ouéé .. .merci Kanor ...
Pour la librairie . pyftplib  .. en effet à l'heure actuelle ..  je devrais commenter cette partie .....
J'y reviendrais plus tard ... ( j'aurrais dut y penser !!! )

Dans le dernier code, je ne vois pas l'interface il semble qu'il manque la ligne
self.window.show() à la fin de la méthode __init__

Oui c'est normal ....  En fait  le script invoque un systray icon avec un fenêtre et un menu click droit sur l' icone ....   .. donc  dans __init__  je ne fait que lancer la création des divers éléments .... ( qui eux contienne le Show() ou pas .... )

Dans la methode logGtkServerLauncher tu doit remplacer
window_GtkServerLauncher par self.window_GtkServerLauncher
si tu ne veux pas que tes autre méthode ne plante

Ok ....

De plus tu dois remplacer la ligne
bt_start.connect("clicked", self.startServer('xterm')
par
bt_start.connect("clicked", self.startServer)
et donc modifier la méthode comme ça
Code:

def startServer(self,widget):
        process_one = subprocess.Popen(['xterm'])
        logINFO('*** PID number ::: %s ' % (process_one.pid))
        self.addServerToList( process_one.pid, 'patate', '/dir/der/der/Der', 20, False, True, 30, 30)
        self.window_GtkServerLauncher.destroy()

Bon cette fonction ne fait quant même pas son boulot

En autre élément embétant c'est que la fenétre reste toujours en avant il doit avoir un prb dans la conf

Pour la fenêtre qui reste .. j'ai remarqué .. mais j'ai pas encore réussi a réparer ...

Pour ce qui es de la lib subprocess .. je n'en suis qu'au début ....
en gros  l'optique c'est de passer en paramètres  les différents éléments du logGtkServerLauncher

        SHARE_DIR = os.path.expanduser('~')
        PORT_NUMBER = '8080'
        UP_LIMIT = '30'
        DOWN_LIMIT = '30'
        USER = 'user'
        PASSWORD = 'password'
        MAX_CONNECT_GEN = '5'
        MAX_CONNECT_IP = '1'

.. puis d'afficher dans la fenêtre principale  dans le treeview .. les divers éléments ..
Et Je récup le Pid .. pour pouvoir arrêter a la volé un serveur ...
Le code actuel ( ou j'en suis ) :

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

#************************************************************

#---------------------placer fenetre sous l'icone !!!!
#------------------------------------------------------------------
#~ def show_window(self, mode=None):
        #~ logINFO('** show_window ..')
        #~ screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
        #~ w_width , w_height = self.window.get_size()
#~ 
        #~ (screen, rect, orientation) = self.statusIcon.get_geometry()
        #~ if rect[0] + w_width > screen_width:
            #~ x = screen_width - w_width
        #~ 
        
#####################################################################
try:	
    import os
    import urllib
    import subprocess
except ImportError:
	print('''ERROR :  Some Modules Are Missing  !!!
	  ...... Exit ...... ''')
	exit()
	

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	#exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'


DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------    

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT(self):
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART(self):
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(self):
	logINFO('** closing window ..')
	self.destroy()
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(self, title, msg, icon):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			# rechercher et definir l'emplacement pour la notification
			(screen, rect, orientation) = self.statusIcon.get_geometry()										
			n = pynotify.Notification(title,msg,icon)
			n.set_hint("x", rect[0])
			n.set_hint("y", rect[1])
			n.show() # show
			n.set_timeout(5) # sec.. before close
	
#-------------------------------------------------------------------------------------------------------		
#-----------MAIN APP  CLASS-----------------------------------------------------------------------------	
#-------------------------------------------------------------------------------------------------------				
class	App():
	
#******************************************************************************************************		
##---INIT ------------------------------------------------ 	
    def __init__(self):
		
		self.booleen_hide_me = False
		self.booleen_focus_check = False		
		self.mode = None
		
		self.create_main_window()
		self.create_menu_click_droit()
		self.create_systray_icon()
		self.window_toggle_hide()

		logNOTIFY(self, 'TEST title', ' TEST msg  bla bla blu blu bli bli', gtk.STOCK_QUIT)
				
#******************************************************************************************************
##---main window------------------------------------------------ 		
    def create_main_window(self):
		logINFO('** create_main_window ..')
######## fenetre
		self.window = gtk.Window()
		self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
		self.window.set_position(gtk.WIN_POS_CENTER)
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)		
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)				
######## box conteneur pour elements
		window_vbox = gtk.VBox()
######## MenuBar widget
		self.menu = gtk.MenuBar()	
		
		main_menu = gtk.Menu()		
		self.menuAddItem(main_menu, 1, 'Main', None, None)
		self.menuAddItem(main_menu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		#self.menuAddItem(main_menu, 0, 'Delete Server', gtk.STOCK_DELETE, mettre action)
		menu_item = gtk.SeparatorMenuItem()
		main_menu.append(menu_item)		
		self.menuAddItem(main_menu, 0, 'Close Window', gtk.STOCK_CLOSE, self.window_toggle_hide)
		self.menuAddItem(main_menu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		
		server_menu = gtk.Menu()
		self.menuAddItem(server_menu, 1, 'Server', None, None)		
		#self.menuAddItem(server_menu, 0, 'Start Server', gtk.STOCK_YES, mettre action )
		#self.menuAddItem(server_menu, 0, 'Stop Server', gtk.STOCK_NO, mettre action )
		
		tools_menu = gtk.Menu()		
		self.menuAddItem(tools_menu, 1, 'Tools', None, None)
		#self.menuAddItem(tools_menu, 0, 'Options', gtk.STOCK_PREFERENCES, mettre action )
		
		help_menu = gtk.Menu()
		self.menuAddItem(help_menu, 1, 'Help', None, None)
		#self.menuAddItem(help_menu, 0, 'Help', gtk.STOCK_HELP, mettre action )
		self.menuAddItem(help_menu, 0, 'About', gtk.STOCK_ABOUT, self.aboutDialog)
				
######## separator		
		separator = gtk.HSeparator()
		window_vbox.pack_start(separator, expand=False)
		
#######	widget scrolled pour list serveur	
		window_scrolled = gtk.ScrolledWindow()
		window_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		
#######	liste server init		
		logINFO('** function create main treeview ..')
		self.server_view = gtk.TreeView()
		self.server_view.set_rules_hint(True)
		
		treeSelection = self.server_view.get_selection()
		treeSelection.set_mode(gtk.SELECTION_SINGLE)		
		#self.server_view.connect("row-activated", self.onActivated)
				
		self.addTreeViewColumn('PID', 0)
		self.addTreeViewColumn('Name', 1)		
		self.addTreeViewColumn('Share Directory', 2)
		self.addTreeViewColumn('Port Number', 3)
		self.addTreeViewColumn('User', 3)
		self.addTreeViewColumn('Anonym.', 4)				
		self.addTreeViewColumn('Upload(kb/s)', 5)		
		self.addTreeViewColumn('Download(kb/s)', 6)			
		
		self.server_list__ = gtk.ListStore(int, str, str, int, bool, bool, int, int)
		self.server_view.set_model(self.server_list__)

		window_scrolled.add(self.server_view)

		window_vbox.pack_start(self.menu, expand=False)					
		window_vbox.pack_end(window_scrolled)
		window_vbox.show_all()
		self.window.add(window_vbox)
		
# Redimensionner la fenetre en fonction des differents widgets a l'interieur
# et suivant leur tailles respective
		a, b = self.server_view.size_request()
		c, d = self.menu.size_request()
		a = a + c
		b = b + d
		self.window.set_size_request(a, b)

		#self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
		#self.window.connect("focus-out-event", self.window_lost_focus)## Only if you want to hide when lost focus
		#self.window.connect("key-press-event", self.window_escape_key_press)## fermer la fenetre lors d'un escape key event
		self.window.connect("destroy", logCLOSE_WINDOW)

#******************************************************************************************************
##---- creer MEnu ----------------------------------------------------
    def menuAddItem(self, menu, int, titre, stock, action):
		if int == 1 :
			#logINFO('** function add main menu ..')
			menu_item = gtk.MenuItem(titre)
			menu_item.set_submenu(menu)
			self.menu.add(menu_item)
		else:
			#logINFO('** function add item menu ..')
			menu_item = gtk.ImageMenuItem(stock)
			menu_item.get_children()[0].set_label(titre)
			menu_item.connect("activate", action)
			menu.append(menu_item)
			
#******************************************************************************************************
##---- add colonne to treeview ----------------------------------------------------
    def addTreeViewColumn(self, titre, columnId):
		#logINFO('** function add treeview ..')
		column = gtk.TreeViewColumn(titre, gtk.CellRendererText(), text=columnId)
		column.set_resizable(True)
		column.set_sort_column_id(columnId)
		self.server_view.append_column(column)
		
#******************************************************************************************************        
##----systray icon    ------------------------------------------
    def create_systray_icon(self):
        logINFO('** create_systray_icon ..')
        self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
        self.statusIcon.set_visible(True)
        self.statusIcon.set_tooltip(APP_NAME)
        self.statusIcon.connect('popup-menu', self.systrayPopupMenu)
        self.statusIcon.connect('activate', self.window_toggle_hide)
 			    
#******************************************************************************************************
##---- Cacher la fenetre ----------------------------------------------------
    def window_toggle_hide(self, widget=None, event=None):
		if self.booleen_hide_me:
			self.booleen_hide_me = False
			#self.show_window()
			self.window.show()
			self.booleen_focus_check = True
			logINFO('** toggle_show ..')
		else:
			self.booleen_hide_me = True
			self.booleen_focus_check = False 
			self.window.hide()
			logINFO('** toggle_hide ..') 
			
#******************************************************************************************************			
##----Focus de la fenetre------------------------------------------------------
    def window_lost_focus(self, widget, event):
		if self.booleen_focus_check:
			self.window_toggle_hide()

#******************************************************************************************************
##----key event escape quand fenetre a focus -------------------------------------------------
    def window_escape_key_press(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.window_toggle_hide()

#******************************************************************************************************		
##----MENU POPUP click droit  ---------------------------------------
    def create_menu_click_droit(self):
		logINFO('** create_menu_click_droit ..')
		self.popupMenu = gtk.Menu()
		self.menuAddItem(self.popupMenu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		self.menuAddItem(self.popupMenu, 0, 'About', gtk.STOCK_ABOUT, self.aboutDialog)
		self.menuAddItem(self.popupMenu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		self.popupMenu.show_all()
		
#******************************************************************************************************		
##----SHOW MENU POPUP CLICK DROIT------------------------------------------
    def systrayPopupMenu(self, widget, button, time):
		logINFO('** systray_popup_click_droit_menu ..')
		self.popupMenu.popup(None, None, None, 0, time)    
		### bizarre ... cette ligne s'affiche ..........  
			
#******************************************************************************************************
##---ABOUT DIALOG  Menu click droit --------------------------------------------------
    def aboutDialog(self, widget, data=None):
		about = gtk.AboutDialog()
		about.set_program_name(APP_NAME)
		about.set_version(APP_VERSION)
		about.set_authors(['tadan', 'pouett'])
		#about.set_logo()
		about.set_website('htt://www.mon_site.com')
		about.set_comments(APP_DESC)
		about.run()
		about.destroy() 

#******************************************************************************************************      
##---Fenetre Creer un serveur -------------------------------------------------- 
    def logGtkServerLauncher(self, widget):
#---VALEUR DEFAULT SERVEUR---------------------------------------------------------------------------------------
		SHARE_DIR = os.path.expanduser('~')
		PORT_NUMBER = '8080'
		UP_LIMIT = '30'
		DOWN_LIMIT = '30'
		USER = 'user'
		PASSWORD = 'password'
		MAX_CONNECT_GEN = '5'
		MAX_CONNECT_IP = '1'  
		  
#---fenetre launcher---------------------------------------------------------------------------------------
		self.window_GtkServerLauncher = gtk.Window()
		self.window_GtkServerLauncher.set_title('Create a Server')
		self.window_GtkServerLauncher.set_keep_below(False)
		self.window_GtkServerLauncher.set_keep_above(True)
		self.window_GtkServerLauncher.set_skip_taskbar_hint(True)
		self.window_GtkServerLauncher.connect("destroy", logCLOSE_WINDOW)
		
#---tableau launcher------------------------------------------------------------------------------------------
		tableau_GtkServerLauncher = gtk.Table(rows=20, columns=5, homogeneous=False)
		tableau_GtkServerLauncher.set_row_spacings(5)
		tableau_GtkServerLauncher.set_col_spacings(5)
		
		##nom du serveur
		bt_name_GtkServerLauncher = gtk.Button("Serveur Name :")		
		tableau_GtkServerLauncher.attach(bt_name_GtkServerLauncher, 1, 2, 1, 2)
		text_name_GtkServerLauncher = gtk.Entry()
		text_name_GtkServerLauncher.set_text('serveur name')
		text_name_GtkServerLauncher.set_editable(False)
		tableau_GtkServerLauncher.attach(text_name_GtkServerLauncher, 3, 4, 1, 2)
		bt_name_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_name_GtkServerLauncher,
		                                 'choose Serveur Name ', 'Use only Letter, number, No Special Char.', True) 
		## dossier de partage 	
		bt_dir_GtkServerLauncher = gtk.Button("Share Dir. :")
		tableau_GtkServerLauncher.attach(bt_dir_GtkServerLauncher, 1, 2, 2, 3)
		text_dir_GtkServerLauncher = gtk.Entry()
		tableau_GtkServerLauncher.attach(text_dir_GtkServerLauncher, 3, 4, 2, 3)
		text_dir_GtkServerLauncher.set_text(SHARE_DIR)
		bt_dir_GtkServerLauncher.connect("clicked", self.dir_chooser, text_dir_GtkServerLauncher)
		text_dir_GtkServerLauncher.set_editable(False)
		
		## upload limit
		bt_up_GtkServerLauncher = gtk.Button("Upload Limit :")
		tableau_GtkServerLauncher.attach(bt_up_GtkServerLauncher, 1, 2, 3, 4)
		text_up_GtkServerLauncher = gtk.Entry()
		text_up_GtkServerLauncher.set_editable(False)
		text_up_GtkServerLauncher.set_text(UP_LIMIT)
		tableau_GtkServerLauncher.attach(text_up_GtkServerLauncher, 3, 4, 3, 4)
		bt_up_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_up_GtkServerLauncher,
		                                 'define Upload ', 'Bandwitch limit : Kb/s', True)
		## download limit
		bt_dl_GtkServerLauncher = gtk.Button("Download Limit :")
		tableau_GtkServerLauncher.attach(bt_dl_GtkServerLauncher, 1, 2, 4, 5)
		text_dl_GtkServerLauncher = gtk.Entry()
		text_dl_GtkServerLauncher.set_editable(False)
		text_dl_GtkServerLauncher.set_text(DOWN_LIMIT)		
		tableau_GtkServerLauncher.attach(text_dl_GtkServerLauncher, 3, 4, 4, 5)
		bt_dl_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_dl_GtkServerLauncher,
		                                 'define Download ', 'Bandwitch limit : Kb/s', True)
		## USER
		bt_user_GtkServerLauncher = gtk.Button("User :")
		tableau_GtkServerLauncher.attach(bt_user_GtkServerLauncher, 1, 2, 5, 6)
		text_user_GtkServerLauncher = gtk.Entry()		
		text_user_GtkServerLauncher.set_editable(False)
		text_user_GtkServerLauncher.set_text(USER)
		tableau_GtkServerLauncher.attach(text_user_GtkServerLauncher, 3, 4, 5, 6)
		bt_user_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_user_GtkServerLauncher,
		                                 'define', 'Specify User Name', True)
		## PasWord
		bt_passw_GtkServerLauncher = gtk.Button("Password :")
		tableau_GtkServerLauncher.attach(bt_passw_GtkServerLauncher, 1, 2, 6, 7)
		text_passw_GtkServerLauncher = gtk.Entry()
		text_passw_GtkServerLauncher.set_visibility(False)
		text_passw_GtkServerLauncher.set_editable(False)
		text_passw_GtkServerLauncher.set_text(PASSWORD)
		tableau_GtkServerLauncher.attach(text_passw_GtkServerLauncher, 3, 4, 6, 7)
		bt_passw_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_passw_GtkServerLauncher,
		                                 'define', 'Specify Password', False)						
		## write acces for user  ( desactiver  dl limit si pas d'acces en write )
		label_check_box_rw_GtkServerLauncher = gtk.Label('User Write privilege')
		tableau_GtkServerLauncher.attach(label_check_box_rw_GtkServerLauncher, 1, 2, 7, 8)
		check_box_rw_GtkServerLauncher = gtk.CheckButton('Yes / No')
#-------#actif = check_button.get_active()  # return true si cocher 
		tableau_GtkServerLauncher.attach(check_box_rw_GtkServerLauncher, 3, 4, 7, 8)
				
		## Max Connection 
		bt_max_con_GtkServerLauncher = gtk.Button("Serv. Max. Connect. :")
		tableau_GtkServerLauncher.attach(bt_max_con_GtkServerLauncher, 1, 2, 8, 9)
		text_max_con_GtkServerLauncher = gtk.Entry()		
		text_max_con_GtkServerLauncher.set_editable(False)
		text_max_con_GtkServerLauncher.set_text(MAX_CONNECT_GEN)
		tableau_GtkServerLauncher.attach(text_max_con_GtkServerLauncher, 3, 4, 8, 9)
		bt_max_con_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_max_con_GtkServerLauncher,
		                                 'Set Value', 'Max. Numb. Connect. /Server ', True)		
		## Max connection by IP
		bt_max_con_ip_GtkServerLauncher = gtk.Button("Max. Connect. per IP :")
		tableau_GtkServerLauncher.attach(bt_max_con_ip_GtkServerLauncher, 1, 2, 9, 10)
		text_max_con_ip_GtkServerLauncher = gtk.Entry()		
		text_max_con_ip_GtkServerLauncher.set_editable(False)
		text_max_con_ip_GtkServerLauncher.set_text(MAX_CONNECT_IP)
		tableau_GtkServerLauncher.attach(text_max_con_ip_GtkServerLauncher, 3, 4, 9, 10)
		bt_max_con_ip_GtkServerLauncher.connect("clicked", self.entryDialogBox, text_max_con_ip_GtkServerLauncher,
		                                 'define', 'Max. Numb. Connect. per IP /Server ', True)		
		## activer le mode anonymous
		label_check_box_an_GtkServerLauncher = gtk.Label('Anonymous Mode')
		tableau_GtkServerLauncher.attach(label_check_box_an_GtkServerLauncher, 1, 2, 10, 11)
		check_box_an_GtkServerLauncher = gtk.CheckButton('On / Off')
		tableau_GtkServerLauncher.attach(check_box_an_GtkServerLauncher, 3, 4, 10, 11)
		
		## Boite Bouton
		bt_box = gtk.HBox(False, 4)
		bt_start = gtk.Button(stock=gtk.STOCK_SAVE)
		bt_start.connect("clicked", self.startServer)
		bt_box.add(bt_start)

		## barre de Status     ########## il faut rajouter fonction pour afficher tooltips lors de survol ^^
		status_bar_GtkServerLauncher = gtk.Statusbar()
		status_bar_GtkServerLauncher.push(2, 'status bar')
		
#--- VertiCAL BOX  Main !!!  ( pour rentrer tous les elements )
		vbox_main_GtkServerLauncher = gtk.VBox()
		vbox_main_GtkServerLauncher.pack_start(tableau_GtkServerLauncher)
		vbox_main_GtkServerLauncher.pack_start(bt_box)
		vbox_main_GtkServerLauncher.pack_start(status_bar_GtkServerLauncher)

		self.window_GtkServerLauncher.add(vbox_main_GtkServerLauncher)
		self.window_GtkServerLauncher.show_all()
		
#******************************************************************************************************
##-----Choisir Repertoire de partage----------------------------------------------------------------------------		
    def	dir_chooser(self, widget, entry):
		logINFO('** dir_chooser ..')		
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, 
										(gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.path.expanduser('~'))
		if dialogue.run() == gtk.RESPONSE_OK:
			entry.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
		else:
			dialogue.destroy()
			
#******************************************************************************************************
##-----Choisir valeur----------------------------------------------------------------------------
    def	entryDialogBox(self, widget, entry, titre, description, bool):
		logINFO('** valeur_entry ..')
		dialog_box = gtk.Dialog(titre, None, gtk.DIALOG_MODAL,(gtk.STOCK_OK, 
							gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
		value_entry = gtk.Entry()
		value_entry.set_visibility(bool)
		value_entry.set_text(entry.get_text())
		# Insertion pour affichage des gtk.Entry et gtk.Label dans la boite de dialogue	
		# Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox	 de la classe (self )
		value_description = gtk.Label(description)
		dialog_box.vbox.pack_start(value_description, True, False, 0)
		dialog_box.vbox.pack_start(value_entry, True, False, 0)
		dialog_box.vbox.show_all()
		if dialog_box.run() == gtk.RESPONSE_OK:	
			entry.set_text(value_entry.get_text())
			dialog_box.destroy()	
		else:
			dialog_box.destroy()
					
#******************************************************************************************************
##-----add Serveur to gtktreeview----------------------------------------------------------------------------			
    def addServerToList(self, pidNumb, name, dir, port, bool1, bool2, up, dl):
		self.server_list__.append([pidNumb, name, dir, port, bool1,  bool2, up, dl])
		
#******************************************************************************************************
##-----rm Serveur tfrom gtktreeview----------------------------------------------------------------------------				
    def rmServerToList(self, titer):
		self.server_list__.remove(titer)
		
#******************************************************************************************************
##---- lors d'un click sur item treeview----------------------------------------------------------------------------				
    def onActivated(self, widget, row, col):
		logINFO('*** activated row: %s  col: %s' % (row, col))
		
#******************************************************************************************************
##---- Start du server  + recup du pid ---------------------------------------------------------------------------		
    def startServer(self, widget):
		PortNum = text_name_GtkServerLauncher.get_text()
		process_one = subprocess.Popen(['python -m SimpleHTTPServer'])
		logINFO('*** PID number ::: %s ' % (process_one.pid))
		self.addServerToList( process_one.pid, 'patate', '/dir/der/der/Der', 20, False, True, 30, 30)
		#self.window_GtkServerLauncher.destroy()
				          
if __name__ == "__main__":
	app = App()
	logSTART(app)

ps  .. merci Kanor ... 
Et oui .toujours ..si jamais ya des amateurs pour tester .. j'attend n'importe qu'elle .  remarques, conseils ou même corrections !!!!.
ps bis .. merci a ceux qui suivent )


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#40 Le 15/03/2010, à 15:31

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

RE  Tout le monde ....
..
Suite a mon envie de simplifier l'ajout d'item dans un widget "gtk.Table "j'ai fait une fonction ..
Elle permet de rentrer différents type d'éléments  par ligne  dans ma table   suivant mes besoins ..

#******************************************************************************************************
##-----Add item To table----------------------------------------------------------------------------	
    def addItemTable(self, wichItemInt, tableName, widgetName1, widgetName2, HrowStart, HrowEnd, VrowStart, VrowEnd, 
				     textvalue1, textvalue2, textvalue3, textvalue4, bool1, bool2, funct):
		if wichItemInt == 0:
			widgetName1 = gtk.Button(textvalue1)
			widgetName2 = gtk.Entry()
			widgetName2.set_editable(False)
			widgetName2.set_text(textvalue2)
			widgetName2.set_visibility(bool1)
			tableName.attach(widgetName1, HrowStart, HrowEnd, VrowStart, VrowEnd)
			tableName.attach(widgetName2, int(HrowStart + 2), int(HrowEnd + 2), VrowStart, VrowEnd)
			widgetName1.connect("clicked", funct, widgetName2, textvalue3, textvalue4, bool2)
		if wichItemInt == 1:
			widgetName1 = gtk.Label(textvalue1)
			widgetName2 = gtk.CheckButton(textvalue2)
			tableName.attach(widgetName1, HrowStart, HrowEnd, VrowStart, VrowEnd)
			tableName.attach(widgetName2, int(HrowStart + 2), int(HrowEnd + 2), VrowStart, VrowEnd)

Cela m'a permis de supprimer une petite 40ene de ligne qui était trop souvent répété ..
exemple pour rajouter une ligne avec un gtk.Button .. un gtk.Entry .. un appel a function pour remplir mon gtk.Entry  .. suivant ma configuration ^^

		self.addItemTable(0, tableau_GtkServerLauncher, 'buttonServerName', 'textServerName', 1, 2, 1, 2,
		'Server Name:', 'name', 'Define Server Name', 'Use only Letter or number, No Special Char.', True, True, self.entryDialogBox)

ps: petit a petit .. j'améliore mes connaissances ...
Et toujours .. merci à ceux qui suivent .....  qui commentent, corrigent ou conseillent   ^^^


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#41 Le 23/03/2010, à 00:34

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

SAlut Tout le Monde !!!!!
Voila juste pour partager avec vous mes progrès ...
J'ai réglé le problème de la fenêtre qui ne se fermait pas .... D'un widget gtk.Window  elle est passé en gtk.Dialog.
J'ai modifié la fonction pour ajouté des éléments dans la table ..... en effet ... il etait alors impossible de récupérer les valeurs ...
et Ptêt d'autre truc que j'ai oublier !!!!

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

#   Interface Gui Pour lancer un petit FTP sur sa Machine
# 
#   This program is distributed under the terms of the GNU General Public License
#   For more info see http://www.gnu.org/licenses/gpl.txt
#

#************************************************************
try:	
    import os
    import urllib
    import subprocess
except ImportError:
	print('''ERROR :  Some Modules Are Missing  !!!
	  ...... Exit ...... ''')
	exit()
	

try:
	import pynotify
	BOOL_NOTIFY=True

except Warning:
	print('Warning: Pynotify is missing, notify will be disable')
	BOOL_NOTIFY=False
	
try:
	from pyftpdlib import ftpserver
except ImportError:
	print('''ERROR : You Need To install pyftplib 
	Site Web :http://code.google.com/p/pyftpdlib''')
	#exit()
	
try:
    import gtk
except ImportError:
    print('ERROR : Install PyGTK ( GTK+ for Python )')
    exit()
    
#------------------------------------------------
#-VARIABLES GLOBALES-----------------------------
#------------------------------------------------

APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'


DEBUG=True	# True / False ( only for debbuging )

#------------------------------------------------
#-FONCTIONS GENERALES-----------------------------
#------------------------------------------------    

#---FOnction debug
def logINFO(msg):
	if DEBUG:
		print('%s - %s' % (APP_NAME, msg))
		
#---EXIT APP
def logEXIT(self):
	logINFO('** Exit ..')
	gtk.main_quit()
	
#---START APP
def logSTART(self):
	logINFO('** Start ..')
	gtk.main()
	
#---CLOSE WINDOW APP
def logCLOSE_WINDOW(self):
	logINFO('** closing window ..')
	self.destroy()
																   	
#---afficher adresse du serveur ( avec le port )  pour accessibilité et partage + facile
#   il faudra rajouter une option au cas ou adresse dyndns  ...
def logPRINT_ADRESS(port_num):
	page = urllib.urlopen("http://www.monip.org/").read()
	ip = page.split("IP : ")[1].split("<br>")[0]
	print('ftp://%s:%s' % (ip, port_num))
	
#---notification systeme
def logNOTIFY(self, title, msg, icon):
	if BOOL_NOTIFY:
		if pynotify.init("%prog"):
			# rechercher et definir l'emplacement pour la notification
			(screen, rect, orientation) = self.statusIcon.get_geometry()										
			n = pynotify.Notification(title,msg,icon)
			n.set_hint("x", rect[0])
			n.set_hint("y", rect[1])
			n.show() # show
			n.set_timeout(5) # sec.. before close
	
#-------------------------------------------------------------------------------------------------------		
#-----------MAIN APP  CLASS-----------------------------------------------------------------------------	
#-------------------------------------------------------------------------------------------------------				
class	App():
	
#******************************************************************************************************		
##---INIT ------------------------------------------------ 	
    def __init__(self):
		
		self.booleen_hide_me = False
		self.booleen_focus_check = False		
		self.mode = None
		
		self.create_main_window()
		self.create_menu_click_droit()
		self.create_systray_icon()
		self.window_toggle_hide()

		logNOTIFY(self, 'TEST title', ' TEST msg  bla bla blu blu bli bli', gtk.STOCK_QUIT)
				
#******************************************************************************************************
##---main window------------------------------------------------ 		
    def create_main_window(self):
		logINFO('** create_main_window ..')
######## fenetre
		self.window = gtk.Window()
		self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
		self.window.set_position(gtk.WIN_POS_CENTER)
		self.window.set_title(APP_NAME)
		self.window.set_name("%sWindow" % APP_NAME)		
		self.window.set_keep_below(False)
		self.window.set_keep_above(True)
		self.window.set_skip_taskbar_hint(True)				
######## box conteneur pour elements
		window_vbox = gtk.VBox()
######## MenuBar widget
		self.menu = gtk.MenuBar()	
		
		main_menu = gtk.Menu()		
		self.menuAddItem(main_menu, 1, 'Main', None, None)
		self.menuAddItem(main_menu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		#self.menuAddItem(main_menu, 0, 'Delete Server', gtk.STOCK_DELETE, mettre action)
		menu_item = gtk.SeparatorMenuItem()
		main_menu.append(menu_item)		
		self.menuAddItem(main_menu, 0, 'Close Window', gtk.STOCK_CLOSE, self.window_toggle_hide)
		self.menuAddItem(main_menu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		
		server_menu = gtk.Menu()
		self.menuAddItem(server_menu, 1, 'Server', None, None)		
		#self.menuAddItem(server_menu, 0, 'Start Server', gtk.STOCK_YES, mettre action )
		#self.menuAddItem(server_menu, 0, 'Stop Server', gtk.STOCK_NO, mettre action )
		
		tools_menu = gtk.Menu()		
		self.menuAddItem(tools_menu, 1, 'Tools', None, None)
		#self.menuAddItem(tools_menu, 0, 'Options', gtk.STOCK_PREFERENCES, mettre action )
		
		help_menu = gtk.Menu()
		self.menuAddItem(help_menu, 1, 'Help', None, None)
		#self.menuAddItem(help_menu, 0, 'Help', gtk.STOCK_HELP, mettre action )
		self.menuAddItem(help_menu, 0, 'About', gtk.STOCK_ABOUT, self.aboutDialog)
				
######## separator		
		separator = gtk.HSeparator()
		window_vbox.pack_start(separator, expand=False)
		
#######	widget scrolled pour list serveur	
		window_scrolled = gtk.ScrolledWindow()
		window_scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		
#######	liste server init		
		logINFO('** function create main treeview ..')
		self.server_view = gtk.TreeView()
		self.server_view.set_rules_hint(True)
		
		treeSelection = self.server_view.get_selection()
		treeSelection.set_mode(gtk.SELECTION_SINGLE)		
		#self.server_view.connect("row-activated", self.onActivated)
				
		self.addTreeViewColumn('PID', 0)
		self.addTreeViewColumn('Name', 1)		
		self.addTreeViewColumn('Share Directory', 2)
		self.addTreeViewColumn('Port Number', 3)
		self.addTreeViewColumn('User', 3)
		self.addTreeViewColumn('Anonym.', 4)				
		self.addTreeViewColumn('Upload(kb/s)', 5)		
		self.addTreeViewColumn('Download(kb/s)', 6)			
		
		self.server_list__ = gtk.ListStore(int, str, str, int, bool, bool, int, int)
		self.server_view.set_model(self.server_list__)

		window_scrolled.add(self.server_view)

		window_vbox.pack_start(self.menu, expand=False)					
		window_vbox.pack_end(window_scrolled)
		window_vbox.show_all()
		self.window.add(window_vbox)
		
		# Redimensionner la fenetre en fonction des differents widgets a l'interieur
		# et suivant leur tailles respective
		a, b = self.server_view.size_request()
		c, d = self.menu.size_request()
		a = a + c
		b = b + d
		self.window.set_size_request(a, b)

		#self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
		#self.window.connect("focus-out-event", self.window_lost_focus)## Only if you want to hide when lost focus
		#self.window.connect("key-press-event", self.window_escape_key_press)## fermer la fenetre lors d'un escape key event
		
		self.window.connect("destroy", self.window_toggle_hide) # problem ici   .. ..
		# Quand on ferme avec la croix ... on perd l'affichage
		# mettre un avertissement ... et quitter l'application si choix ok .. sinon hide window

#******************************************************************************************************
##---- creer MEnu ----------------------------------------------------
    def menuAddItem(self, menu, int, titre, stock, action):
		if int == 1 :
			#logINFO('** function add main menu ..')
			menu_item = gtk.MenuItem(titre)
			menu_item.set_submenu(menu)
			self.menu.add(menu_item)
		else:
			#logINFO('** function add item menu ..')
			menu_item = gtk.ImageMenuItem(stock)
			menu_item.get_children()[0].set_label(titre)
			menu_item.connect("activate", action)
			menu.append(menu_item)
			
#******************************************************************************************************
##---- add colonne to treeview ----------------------------------------------------
    def addTreeViewColumn(self, titre, columnId):
		#logINFO('** function add treeview ..')
		column = gtk.TreeViewColumn(titre, gtk.CellRendererText(), text=columnId)
		column.set_resizable(True)
		column.set_sort_column_id(columnId)
		self.server_view.append_column(column)
		
#******************************************************************************************************        
##----systray icon    ------------------------------------------
    def create_systray_icon(self):
        logINFO('** create_systray_icon ..')
        self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
        self.statusIcon.set_visible(True)
        self.statusIcon.set_tooltip(APP_NAME)
        self.statusIcon.connect('popup-menu', self.systrayPopupMenu)
        self.statusIcon.connect('activate', self.window_toggle_hide)
 			    
#******************************************************************************************************
##---- Cacher la fenetre ----------------------------------------------------
    def window_toggle_hide(self, widget=None, event=None):
		if self.booleen_hide_me:
			self.booleen_hide_me = False
			#self.show_window()
			self.window.show()
			self.booleen_focus_check = True
			logINFO('** toggle_show ..')
		else:
			self.booleen_hide_me = True
			self.booleen_focus_check = False 
			self.window.hide()
			logINFO('** toggle_hide ..') 
			
#******************************************************************************************************			
##----Focus de la fenetre------------------------------------------------------
    def window_lost_focus(self, widget, event):
		if self.booleen_focus_check:
			self.window_toggle_hide()

#******************************************************************************************************
##----key event escape quand fenetre a focus -------------------------------------------------
    def window_escape_key_press(self, widget, event):
        if event.keyval == gtk.keysyms.Escape:
            self.window_toggle_hide()

#******************************************************************************************************		
##----MENU POPUP click droit  ---------------------------------------
    def create_menu_click_droit(self):
		logINFO('** create_menu_click_droit ..')
		self.popupMenu = gtk.Menu()
		self.menuAddItem(self.popupMenu, 0, 'New Server', gtk.STOCK_NEW, self.logGtkServerLauncher)
		self.menuAddItem(self.popupMenu, 0, 'About', gtk.STOCK_ABOUT, self.aboutDialog)
		self.menuAddItem(self.popupMenu, 0, 'Exit', gtk.STOCK_QUIT, logEXIT)
		self.popupMenu.show_all()
		
#******************************************************************************************************		
##----SHOW MENU POPUP CLICK DROIT------------------------------------------
    def systrayPopupMenu(self, widget, button, time):
		logINFO('** systray_popup_click_droit_menu ..')
		self.popupMenu.popup(None, None, None, 0, time)    
		### bizarre ... cette ligne s'affiche ..........  
			
#******************************************************************************************************
##---ABOUT DIALOG  Menu click droit --------------------------------------------------
    def aboutDialog(self, widget, data=None):
		about = gtk.AboutDialog()
		about.set_program_name(APP_NAME)
		about.set_version(APP_VERSION)
		about.set_authors(['tadan', 'pouett'])
		#about.set_logo()
		about.set_website('htt://www.mon_site.com')
		about.set_comments(APP_DESC)
		about.run()
		about.destroy() 

#******************************************************************************************************      
##---Fenetre Creer un serveur -------------------------------------------------- 
    def logGtkServerLauncher(self, widget):
#---VALEUR DEFAULT SERVEUR---------------------------------------------------------------------------------------
		SHARE_DIR = os.path.expanduser('~')
		PORT_NUMBER = '8080'
		OUT_LIMIT = '30'
		IN_LIMIT = '30'
		USER = 'user'
		PASSWORD = 'password'
		MAX_CONNECT_GEN = '5'
		MAX_CONNECT_IP = '1'
		
#---tableau launcher------------------------------------------------------------------------------------------
		tableau_GtkServerLauncher = gtk.Table(rows=20, columns=5, homogeneous=False)
		tableau_GtkServerLauncher.set_row_spacings(5)
		tableau_GtkServerLauncher.set_col_spacings(5)
			
		##nom du serveur
		buttonServerName = gtk.Button('Server Name:')
		textServerName = gtk.Entry()
		self.addItemTable(0, tableau_GtkServerLauncher, buttonServerName, textServerName, 1, 2, 1, 2,
		'name', 'Define Server Name', 'Only letter [A-Z] or digit [0-9]', True, True, self.entryDialogBox)	
			
		### dossier de partage
		buttonWichDIR = gtk.Button('Serv. Directory:')
		textWichDIR = gtk.Entry()		 
		self.addItemTable(0, tableau_GtkServerLauncher, buttonWichDIR, textWichDIR, 1, 2, 2, 3,
		SHARE_DIR, '', '', True, True, self.dir_chooser)
		
		### activer le mode anonymous
		labelCheckAnonymous = gtk.Label('Anonymous Mode')
		boxCheckAnonymous = gtk.CheckButton('On / Off')
		self.addItemTable(1, tableau_GtkServerLauncher, labelCheckAnonymous, boxCheckAnonymous, 1, 2, 3, 4,
		'On / Off', '', '', True, True, None)
		boxCheckAnonymous.set_active(True)
									
		### upload limit
		buttonLimitUP = gtk.Button('Out. Bandwitch limit :')
		textLimitUP = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonLimitUP, textLimitUP, 1, 2, 4, 5,
		OUT_LIMIT, 'Define Outbound', 'Bandwitch limit : Kb/s', True, True, self.entryDialogBox)
		
		### activer le mode USER
		labelCheckUser = gtk.Label('User Mode')
		boxCheckUser = gtk.CheckButton('On / Off')
		self.addItemTable(1, tableau_GtkServerLauncher, labelCheckUser, boxCheckUser, 1, 2, 5, 6,
		'On / Off', '', '', True, True, None)
								
		### USER
		buttonUserName = gtk.Button('User Name :')
		textUserName = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonUserName, textUserName, 1, 2, 6, 7,
		USER, 'Define', 'Specify User Name', True, True, self.entryDialogBox)	
						
		## PasWord
		buttonUserPass = gtk.Button('User Password :')
		textUserPass = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonUserPass, textUserPass, 1, 2, 7, 8,
		PASSWORD, 'Define', 'Specify Password', False, False, self.entryDialogBox)	
		                    						
		## write acces for user
		labelCheckUserWrite = gtk.Label('User Write privilege:')
		boxCheckUserWrite = gtk.CheckButton('Yes / No')		
		self.addItemTable(1, tableau_GtkServerLauncher, labelCheckUserWrite, boxCheckUserWrite, 1, 2, 8, 9,
		'', '', '', True, True, None)
				
		## desactiver widget si pas besoin
		self.setSensitiveItem(buttonUserName, textUserName)
		self.setSensitiveItem(buttonUserPass, textUserPass)
		self.setSensitiveItem(labelCheckUserWrite, boxCheckUserWrite)
		boxCheckUser.connect("clicked", self.widgetToggleHide, buttonUserName, textUserName)
		boxCheckUser.connect("clicked", self.widgetToggleHide, buttonUserPass, textUserPass)
		boxCheckUser.connect("clicked", self.widgetToggleHide, labelCheckUserWrite, boxCheckUserWrite)      
        		
		## download limit  if write acces
		buttonLimitDL = gtk.Button('In. Bandwitch limit:')
		textLimitDL = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonLimitDL, textLimitDL, 1, 2, 9, 10,
		IN_LIMIT, 'Define Inbound', 'Bandwitch limit Kb/s :', True, True, self.entryDialogBox)
		
		## desactiver widget si pas besoin
		self.setSensitiveItem(buttonLimitDL, textLimitDL)
		boxCheckUserWrite.connect("clicked", self.widgetToggleHide,buttonLimitDL, textLimitDL)
		
		### Max Connection
		buttonMaxConServer = gtk.Button('Serv. Max. Connect. :')
		textMaxConServer = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonMaxConServer, textMaxConServer, 1, 2, 10, 11,
		MAX_CONNECT_GEN, 'Set Value', 'Max. Numb. Connect. /Server ', True, True, self.entryDialogBox) 	
		
		### Max connection by IP
		buttonMaxConIp = gtk.Button('Max. Connect. per IP :')
		textMaxConIp = gtk.Entry()		
		self.addItemTable(0, tableau_GtkServerLauncher, buttonMaxConIp, textMaxConIp, 1, 2, 11, 12, 
		MAX_CONNECT_IP, 'Define', 'Max. Numb. Connect. per IP /Server', True, True, self.entryDialogBox)                                	
		
		## PORT SErver
		buttonNumbPort = gtk.Button('Serv. Port Number')
		textNumbPort = gtk.Entry()
		self.addItemTable(0, tableau_GtkServerLauncher, buttonNumbPort, textNumbPort, 1, 2, 12, 13, 
		PORT_NUMBER, 'Define Server', 'Port Numb :', True, True, self.entryDialogBox)		
		
		dialogGtkServerLauncher = gtk.Dialog('title', None,
		gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_OK, gtk.RESPONSE_OK))				
		dialogGtkServerLauncher.vbox.pack_start(tableau_GtkServerLauncher)
		dialogGtkServerLauncher.vbox.show_all()

####  récupérer les valeurs ..
####checkbox :  actif = check_button.get_active()  # return true si cocher 
####text entry :          value = widgetNameText.get_text()    # return value of text entry 
		ANONYMOUS_MODE = True
		USER_MODE = False
		USER_WRITE = False
		if 	dialogGtkServerLauncher.run() == gtk.RESPONSE_OK:
			NAME = textServerName.get_text()
			SHARE_DIR = textWichDIR.get_text()
			PORT_NUMBER = textNumbPort.get_text() 
			OUT_LIMIT = textLimitUP.get_text()
			MAX_CONNECT_GEN = textMaxConServer.get_text()
			MAX_CONNECT_IP = textMaxConIp.get_text()
			if boxCheckAnonymous.get_active():
				ANONYMOUS_MODE = True
			if boxCheckUser.get_active():
				USER_MODE = True
				USER = textUserName.get_text()
				PASSWORD = textUserPass.get_text()
				if boxCheckUserWrite.get_active():
					USER_WRITE = True
					IN_LIMIT = textLimitDL.get_text()
					
			if ANONYMOUS_MODE:
				if USER_MODE:
					if USER_WRITE:
						self.startServer(0, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP,
										  USER, PASSWORD, IN_LIMIT )
					else:
						self.startServer(1, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP,
										  USER, PASSWORD, '')
											  
				else:
					self.startServer(2, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP,
										'', '', '')	
			dialogGtkServerLauncher.destroy()	
					
#******************************************************************************************************
##-----Add item To table----------------------------------------------------------------------------	
    def addItemTable(self, wichItemInt, tableName, widgetName1, widgetName2, HrowStart, HrowEnd, VrowStart, VrowEnd, 
				     textvalue1, textvalue2, textvalue3, bool1, bool2, funct):						 						 
		if wichItemInt == 0:
			widgetName2.set_editable(False)
			widgetName2.set_text(textvalue1)
			widgetName2.set_visibility(bool1)
			tableName.attach(widgetName1, HrowStart, HrowEnd, VrowStart, VrowEnd)
			tableName.attach(widgetName2, int(HrowStart + 2), int(HrowEnd + 2), VrowStart, VrowEnd)
			widgetName1.connect("clicked", funct, widgetName2, textvalue2, textvalue3, bool2)
		if wichItemInt == 1:			
			tableName.attach(widgetName1, HrowStart, HrowEnd, VrowStart, VrowEnd)
			tableName.attach(widgetName2, int(HrowStart + 2), int(HrowEnd + 2), VrowStart, VrowEnd)

#******************************************************************************************************
##-----cacher a l'ouverture les elements non disponible----------------------------------
    def setSensitiveItem(self,item1, item2):
			item1.set_sensitive(False)
			item2.set_sensitive(False)			

#******************************************************************************************************
##----- Toggle  on  off elements disponible-----------------------------------------------------
    def widgetToggleHide(self, checkbox, item1, item2):
			if checkbox.get_active():
				item1.set_sensitive(True)
				item2.set_sensitive(True)
			else:
				item1.set_sensitive(False)
				item2.set_sensitive(False)			
		
##-----Choisir Repertoire de partage----------------------------------------------------------------------------
# les valeurs nonetrick, noneTricks, noneTrick, sont des valeur bluffs juste pour combler ... 
# et eviter erreurs		
    def	dir_chooser(self, widget, entry, noneTrick, nonetrick, NoneTrick):
		logINFO('** dir_chooser ..')		
		dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage", None, gtk.FILE_CHOOSER_ACTION_OPEN, 
										(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
		dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
		dialogue.set_current_folder(os.path.expanduser('~'))
		if dialogue.run() == gtk.RESPONSE_OK:
			entry.set_text(dialogue.get_current_folder())
			print dialogue.get_current_folder()
			dialogue.destroy()
		else:
			dialogue.destroy()
			
#******************************************************************************************************
##-----Choisir valeur----------------------------------------------------------------------------
    def	entryDialogBox(self, widget, entry, titre, description, bool):
		logINFO('** valeur_entry ..')
		dialog_box = gtk.Dialog(titre, None, gtk.DIALOG_MODAL,(gtk.STOCK_OK, 
							gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
		value_entry = gtk.Entry()
		value_entry.set_visibility(bool)
		value_entry.set_text(entry.get_text())
		# Insertion pour affichage des gtk.Entry et gtk.Label dans la boite de dialogue	
		# Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox	 de la classe (self )
		value_description = gtk.Label(description)
		dialog_box.vbox.pack_start(value_description, True, False, 0)
		dialog_box.vbox.pack_start(value_entry, True, False, 0)
		dialog_box.vbox.show_all()
		if dialog_box.run() == gtk.RESPONSE_OK:	
			entry.set_text(value_entry.get_text())
			dialog_box.destroy()	
		else:
			dialog_box.destroy()
					
#******************************************************************************************************
##-----add Serveur to gtktreeview----------------------------------------------------------------------------			
    def addServerToList(self, pidNumb, name, dir, port, bool1, bool2, up, dl):
		self.server_list__.append([pidNumb, name, dir, port, bool1,  bool2, up, dl])
		
#******************************************************************************************************
##-----rm Serveur tfrom gtktreeview----------------------------------------------------------------------------				
    def rmServerToList(self, titer):
		self.server_list__.remove(titer)
		
#******************************************************************************************************
##---- lors d'un click sur item treeview----------------------------------------------------------------------------				
    def onActivated(self, widget, row, col):
		logINFO('*** activated row: %s  col: %s' % (row, col))
		
#******************************************************************************************************
##---- Start du server  + recup du pid ---------------------------------------------------------------------------	
    def startServer(self, witchModeInt, name, dir, port, up, maxServCon, maxServConIp, user, pasword, dl):
		if witchModeInt == 0:
#self.startServer(0, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP, USER, PASSWORD, IN_LIMIT )			
		    print('tadan  0 .... anonymous + user+ write for user')
		    print name, dir, port, up, maxServCon, maxServConIp, user, pasword, dl
		if witchModeInt == 1:
#self.startServer(1, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP, USER, PASSWORD)		
			print('tadan  1 .... anonymous + user')
			print name, dir, port, up, maxServCon, maxServConIp, user, pasword, dl
		if witchModeInt == 2:
#self.startServer(2, NAME, SHARE_DIR, PORT_NUMBER, OUT_LIMIT, MAX_CONNECT_GEN, MAX_CONNECT_IP)
			print('tadan  2 .. ONLY anonymous ')
			print name, dir, port, up, maxServCon, maxServConIp, user, pasword, dl

					
		#process_one = subprocess.Popen(['python -m SimpleHTTPServer'])
		#logINFO('*** PID number ::: %s ' % (process_one.pid))
		#self.addServerToList( process_one.pid, name, dir, up, False, True, 30, 30)
		#self.window_GtkServerLauncher.destroy()
			          
if __name__ == "__main__":
	app = App()
	logSTART(app)

ps: petit à petit ..  j' apprend le python ))
Et toujours .. merci à ceux qui suivent .....  qui commentent, corrigent ou conseillent   ^^^

Dernière modification par UUBBUU_USER (Le 23/03/2010, à 00:45)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#42 Le 23/03/2010, à 00:36

Kanor

Re : Aide a la réalisation d'un script Python

    

try:    
    import os
    import urllib
    import subprocess
except ImportError:
    print('''ERROR :  Some Modules Are Missing  !!!
      ...... Exit ...... ''')
    exit()

En passant ça sert à rien de mettre un except ici c'est des module de base de python si tu les a tu n'a pas python installé sur ta machine

Hors ligne

#43 Le 23/03/2010, à 00:44

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Ok ^^
merci ...

ps: n'hesiter pas à poster tout commentaire ou toutes autres critiques ou corrections ... ...
On en apprend  tous les jours smile   big_smile:D

Par contre j'ai un bug ou plutôt un truc génant ...
Comment obliger ma fenêtre principale  a ne pas se detruire lors d'un click sur la croix .. en effet ... si jamais je la ferme avec cette croix .... il m'est impossible de la récupérer ensuite .. ( elle réapparait  vide ( de bonne taille  mais vide )) ...

Dernière modification par UUBBUU_USER (Le 23/03/2010, à 01:04)


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#44 Le 30/05/2010, à 04:38

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

Projet un peu en pause, mais pas oublié smile


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne

#45 Le 30/05/2010, à 05:33

tipiaf

Re : Aide a la réalisation d'un script Python

Les points de suspension, faut pas en abuser, c'est très désagréable de te lire cause de ça. Vraiment.
Je sais je t'aide pas pour ton bug mais j'avais envie d'embêter quelqu'un (je suis un méchant garçon).


5 bonnes raisons de ne pas utiliser KDE
KDE est à la stabilité ce que Apple est à la liberté.

Hors ligne

#46 Le 31/05/2010, à 02:06

UUBBUU_USER

Re : Aide a la réalisation d'un script Python

lol!


PEACE LOVE UNITY                                                      FREE TIBET

Hors ligne