#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 ^^ )
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é
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 :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é
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