Τα πάντα για την Python

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Ποσοστό επεξεργασίας (επανεγγραφή στην ίδια γραμμή)

Δημοσίευσηαπό medigeek » 22 Ιούλ 2009, 19:36

Ποσοστό επεξεργασίας (επανεγγραφή στην ίδια γραμμή)

Python 2.6 (δουλεύει και σε python3.0):
Κώδικας: Επιλογή όλων

#!/usr/bin/python2.6
import time, sys

print("File processing simulation:")
sys.stdout.write("Processing file 0%..")
sys.stdout.flush()

for percentage in range(10, 101, 10):
time.sleep(1)
sys.stdout.write("%d%%.." % (percentage))
sys.stdout.flush()
print("done!\n")

print("Download simulation:")
sys.stdout.write("Downloading 0%\r")
sys.stdout.flush()

for percentage in range(1, 100, 1):
sys.stdout.write("Downloading %d%%\r" % (percentage))
sys.stdout.flush()
time.sleep(0.1)

print("Downloading 100%")
print("All done!")


Τώρα επειδή η εντολή print() στην python3 υποστηρίζει sep="" και end="", μπορούμε να χρησιμοποιήσουμε το end="":
Κώδικας: Επιλογή όλων
#!/usr/bin/python3.0
import time, sys

print("File processing simulation:")
print("Processing file 0%..", end="")
sys.stdout.flush()

for percentage in range(10, 101, 10):
time.sleep(0.5)
print("%d%%.." % (percentage), end="")
sys.stdout.flush()
print("done!\n")

print("Download simulation:")
print("Downloading 0%", end="\r")

for percentage in range(1, 100, 1):
print("Downloading %d%%" % (percentage), end="\r")
time.sleep(0.1)

print("Downloading 100%")
print("All done!")


Το αποτέλεσμα είναι το ίδιο, αλλά...
απ' ό,τι βλέπετε στην τελευταία περίπτωση δε χρειάζεται το "sys.stdout.flush()" (να το αποστέλνει δηλαδή στην οθόνη και να μην περιμένει άλλα δεδομένα)



\r ;;;
Το \r λέγεται "carriage return". Τι κάνει; Το επιστρέφει τη «θέση επεξεργασίας» στην αρχή, για να ξαναγράψει απο πάνω αυτά που πρέπει.

Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό Phantomas » 27 Ιούλ 2009, 15:01

Κώδικας: Επιλογή όλων
#!/usr/bin/python
import time
for about in range(2): print "\a"; time.sleep(0.5);
for about in range(3): print "\a"; time.sleep(0.25);
time.sleep(0.4)
for about in range(4): print "\a"; time.sleep(0.25);
time.sleep(0.4)
for about in range(2): print "\a"; time.sleep(0.25);

time.sleep(2)
print "\n Morse: "
for about in range(3): print "\a"; time.sleep(0.18);
print " S";time.sleep(0.1);
for about in range(3): print "\a"; time.sleep(0.4);
print " O";time.sleep(0.2);
for about in range(3): print "\a"; time.sleep(0.18);
print " S\n\n"
print "Nice music!\n\n"


Πρόγραμμα που φτιάχνει υπέροχη κλασσική μουσική και την αναπαράγει :mrgreen:
Άβαταρ μέλους
Phantomas
punkTUX
punkTUX
 
Δημοσιεύσεις: 156
Εγγραφή: 28 Ιούλ 2008, 15:57
IRC: Phantomas
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό cyberpython » 28 Ιούλ 2009, 19:46

Μία μικρή εφαρμογή για το κατέβασμα wallpapers από το gnome-look.org.

Εικόνα

Κώδικας:
Spoiler: show
Αρχείο wallpapers.py
Κώδικας: Επιλογή όλων

#!/usr/bin/env python


#import sys
import pygtk
pygtk.require("2.0")
import gtk
import gobject # used by ProgressCellRenderer
import gtk.glade
import gconf #in order to set the wallpaper
import urllib2 #to download things
import threading #for freeze-less downloading and gui stuff
import mimetypes #to determine to what exactly a url points at
import os.path #file name handling
import webbrowser #to open files that are not images
import xml.dom.minidom #to manipulate the files obtained using gnome-look.org's REST API
from xml.dom.minidom import Node # to manipulate the files obtained using gnome-look.org's REST API


#--------------------------------------------------------------------------------------------------
# Class GnomeLookApiForWallpapers
#--------------------------------------------------------------------------------------------------
class GnomeLookApiForWallpapers:

#API_KEY = ""
API_KEY_BASE_64 = ""

available_sort_by_methods = [("date added","new"),("alphabetical order","alpha"),("highest rating","high"),("most downloads","down")]

def __init__(self):
self.categories = []
self.sort_by_method = ""
self.available_categories = []
self.fetch_categories()

def get_sort_by_methods(self):
return GnomeLookApiForWallpapers.available_sort_by_methods

def get_categories(self):
return self.categories

def fetch_categories(self):
theurl = "http://api.gnome-look.org/v1/content/categories"
categories_xml_file = self.download_file(theurl)
doc = xml.dom.minidom.parse(categories_xml_file)

self.categories=[]
for node in doc.getElementsByTagName("category"):
if(node.hasChildNodes()):
category_id = ""
category_name = ""
category_id = node.childNodes[1].childNodes[0].data
category_name = node.childNodes[3].childNodes[0].data
if(category_name.startswith("GNOME Wallpaper")):
self.categories.append( (category_id,category_name) )








def get_wallpapers_list(self, categories, sortmode, pagesize, pagenumber):

theurl = "http://api.gnome-look.org/v1/content/data?categories="+categories+"&sortmode="+sortmode+"&page="+pagenumber+"&pagesize="+pagesize


wallpapers_xml_file = self.download_file(theurl)
doc = xml.dom.minidom.parse(wallpapers_xml_file)
wallpapers = []
for node in doc.getElementsByTagName("content"):
if(node.hasChildNodes()):
nodes = node.childNodes
if(len(nodes) >= 30):
content_id = ""
wallpaper_name = ""
wallpaper_type = ""
wallpaper_thumb_url = ""
content_id = node.childNodes[1].childNodes[0].data
wallpaper_name = node.childNodes[3].childNodes[0].data
wallpaper_type = node.childNodes[13].childNodes[0].data
if(node.childNodes[29].hasChildNodes()):
wallpaper_thumb_url = node.childNodes[29].childNodes[0].data
wallpapers.append( (content_id, wallpaper_name, wallpaper_type, wallpaper_thumb_url) )
return wallpapers








def get_download_url(self, content_id):
theurl = "http://api.gnome-look.org/v1/content/download/"+content_id+"/1"
response = self.download_file(theurl)
doc = xml.dom.minidom.parse(response)
nodes = doc.getElementsByTagName("downloadlink")
link = nodes[0].childNodes[0].data
return link





def download_file(self, url):
req = urllib2.Request(url)
req.add_header("Authorization", "Basic "+GnomeLookApiForWallpapers.API_KEY_BASE_64)
return urllib2.urlopen(req)

#--------------------------------------------------------------------------------------------------
# End of class GnomeLookApiForWallpapers
#--------------------------------------------------------------------------------------------------

#--------------------------------------------------------------------------------------------------
# Class ThumbnailDownloader
#--------------------------------------------------------------------------------------------------

class ThumbnailDownloader(threading.Thread):

def __init__(self, progressbar, liststore, glwd, categories, sortmode, pagesize, pagenumber):
self.stopthread = threading.Event()
self.liststore = liststore
self.glwd = glwd
self.categories = categories
self.sortmode = sortmode
self.pagesize = pagesize
self.pagenumber = pagenumber
self.progressbar = progressbar
threading.Thread.__init__(self)

def run(self):

self.wallpapers_list = self.glwd.get_wallpapers_list(self.categories, self.sortmode, self.pagesize, self.pagenumber)
self.progressbar.set_fraction(0.0)

length = len(self.wallpapers_list)
i = 0

while (i<length) and (not self.stopthread.isSet()) :
wallpaper = self.wallpapers_list[i]
try:
tmp_file = urllib2.urlopen(wallpaper[3])
pixbuf_loader = gtk.gdk.PixbufLoader()
pixbuf_loader.write(tmp_file.read())
pixbuf = pixbuf_loader.get_pixbuf()
pixbuf_loader.close()
tooltip = "Name: "+wallpaper[1]+" \nType: "+wallpaper[2]
gtk.gdk.threads_enter()
self.liststore.append([wallpaper[0], wallpaper[1], tooltip, pixbuf])
gtk.gdk.threads_leave()
except:
pass
gtk.gdk.threads_enter()
self.progressbar.set_fraction(float(i)/float(length))
gtk.gdk.threads_leave()
i = i+1

self.progressbar.set_fraction(0.0)




def stop(self):
self.stopthread.set()

#--------------------------------------------------------------------------------------------------
# End of class ThumbnailDownloader
#--------------------------------------------------------------------------------------------------


#--------------------------------------------------------------------------------------------------
# Class DownloadHandler
#--------------------------------------------------------------------------------------------------
class DownloadHandler(threading.Thread):
def __init__(self, listview_model, filename, url, target_name):
self.listview_model = listview_model
self.url = url
self.download_filename = filename
self.target_name = target_name
threading.Thread.__init__(self)

def run(self):
STEP = 64

listview_item = [self.target_name, 0, self.url, self.download_filename]
gtk.gdk.threads_enter()
listview_item_iter = self.listview_model.append(listview_item)
gtk.gdk.threads_leave()

tmp_file = urllib2.urlopen(self.url)
file_size = int(tmp_file.info().getheaders("Content-Length")[0])
output = open(self.download_filename,'wb')
total = 0
bytes_read = tmp_file.read(STEP)
while (bytes_read != ""):
total = total + STEP
output.write(bytes_read)
bytes_read = tmp_file.read(STEP)
progress = min(100, int((float(total) / float(file_size))*100) )
gtk.gdk.threads_enter()
self.listview_model.set_value(listview_item_iter, 1, int(progress))
gtk.gdk.threads_leave()
output.close()
gtk.gdk.threads_enter()
self.listview_model.set_value(listview_item_iter, 1, 100)
gtk.gdk.threads_leave()

#--------------------------------------------------------------------------------------------------
# End of class DownloadHandler
#--------------------------------------------------------------------------------------------------

#--------------------------------------------------------------------------------------------------
# Class MainApp
#--------------------------------------------------------------------------------------------------


class MainApp:

GLADE_FILE = "wallpapers.glade"

COL_ID = 0
COL_NAME = 1
COL_TOOLTIP = 2
COL_PIXBUF = 3

APP_NAME = "Wallpapers Today"
APP_VERSION = "1.0"
APP_COPYRIGHT = "Copyright (c) 2009, Georgios Migdos"
APP_LICENSE = '''Copyright (c) 2009, Georgios Migdos
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the names of the authors nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.'''

APP_AUTHORS = ["Georgios \"cyberpython\" Migdos <cyberpython@gmail.com>"]


def __init__(self):
self.glwd = GnomeLookApiForWallpapers()
self.thumbs_dloader = None
self.create_gui()
self.populate_wallpaper_type_combo(self.combo1, self.glwd)
self.populate_sort_by_combo(self.combo2, self.glwd)
#self.update_iconview_model()

def create_gui(self):
self.gladefile = MainApp.GLADE_FILE
self.wTree = gtk.glade.XML(self.gladefile)

self.window = self.wTree.get_widget("window1")
self.window.set_title(MainApp.APP_NAME)

self.vbox5 = self.wTree.get_widget("vbox5")
self.combo1 = gtk.combo_box_new_text()
self.vbox5.pack_start(self.combo1, True, True, 0)

self.vbox6 = self.wTree.get_widget("vbox6")
self.combo2 = gtk.combo_box_new_text()
self.vbox6.pack_start(self.combo2, True, True, 0)

self.listview_model = self.create_listview_model()
self.listview = gtk.TreeView(self.listview_model)
self.create_listview_columns(self.listview)
self.listview.set_rules_hint(True)
self.listview.get_selection().set_mode(gtk.SELECTION_SINGLE)
self.scrolled_window2 = self.wTree.get_widget("scrolledwindow2")
self.scrolled_window2.add(self.listview)

self.iconview_model = self.create_iconview_model()
self.iconview = gtk.IconView(self.iconview_model)
self.iconview.set_selection_mode(gtk.SELECTION_MULTIPLE)
self.iconview.set_text_column(-1)
self.iconview.set_pixbuf_column(MainApp.COL_PIXBUF)
self.iconview.set_tooltip_column(MainApp.COL_TOOLTIP)
self.scrolled_window1 = self.wTree.get_widget("scrolledwindow1")
self.scrolled_window1.add(self.iconview)

self.spin1 = self.wTree.get_widget("spinbutton1")
self.progressbar1 = self.wTree.get_widget("progressbar1")
self.expander1 = self.wTree.get_widget("expander1")
self.filechooser_button = self.wTree.get_widget("filechooserbutton2")

self.about_button = self.wTree.get_widget("button1")
self.close_button = self.wTree.get_widget("button2")
self.refresh_button = self.wTree.get_widget("button3")
self.save_button = self.wTree.get_widget("button4")
self.set_wallpaper_button = self.wTree.get_widget("button5")
self.clear_completed_button = self.wTree.get_widget("button6")

self.set_wallpaper_button.set_sensitive(False)

#GUI events:
self.about_button.connect("clicked", self.on_about_button_clicked)
self.close_button.connect("clicked", self.on_close_button_clicked)
self.refresh_button.connect("clicked", self.on_refresh_button_clicked)
self.save_button.connect("clicked", self.on_save_button_clicked)
self.set_wallpaper_button.connect("clicked", self.on_set_wallpaper_button_clicked)
self.clear_completed_button.connect("clicked", self.on_clear_completed_button_clicked)
self.listview.connect("cursor-changed", self.on_listview_cursor_changed)

treemodel = self.listview.get_model()
treemodel.connect("row-changed", self.on_listview_row_changed)
treemodel.connect("row-deleted", self.on_listview_row_deleted)
treemodel.connect("row-inserted", self.on_listview_row_inserted)
treemodel.connect("rows-reordered", self.on_listview_rows_reordered)


self.window.show_all()
if (self.window):
self.window.connect("destroy", self.main_quit)






def main_quit(self, obj):
gtk.gdk.threads_leave()
if(not (self.thumbs_dloader is None)):
self.thumbs_dloader.stop()
self.thumbs_dloader.join()
gtk.main_quit(self)





def populate_sort_by_combo(self, combo, glwd):
sort_by_methods = glwd.get_sort_by_methods()
if len(sort_by_methods)>0:
for item in sort_by_methods:
combo.append_text(item[0])
combo.set_active(0)




def populate_wallpaper_type_combo(self, combo, glwd):
categories = glwd.get_categories()
if len(categories)>0:
for item in categories:
combo.append_text(item[1])
combo.set_active(0)




def create_listview_model(self):
listview_model = gtk.ListStore(str, int, str, str)
return listview_model




def create_listview_columns(self, listview):
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text=0)
column.set_sort_column_id(0)
column.set_resizable(True)
listview.append_column(column)

rendererProgress = ProgressCellRenderer()
column = gtk.TreeViewColumn("Progress", rendererProgress, percent=1)
column.set_sort_column_id(1)
column.set_resizable(True)
listview.append_column(column)

rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Url", rendererText, text=2)
column.set_sort_column_id(2)
column.set_resizable(True)
listview.append_column(column)



def remove_completed_from_listview_model(self):

item_iter = self.listview_model.get_iter_root()
while(item_iter!=None):
if(self.listview_model.iter_is_valid(item_iter)):
progress = self.listview_model.get_value(item_iter, 1)
if(progress == 100):
self.listview_model.remove(item_iter)
else:
item_iter = self.listview_model.get_iter_next(item_iter)
else:
item_iter = None

def on_listview_cursor_changed(self, widget):
self.update_set_wallpaper_button_state()

def on_listview_row_deleted(self, treemodel, path):
self.update_set_wallpaper_button_state()

def on_listview_row_changed(self, treemodel, path, iterator):
self.update_set_wallpaper_button_state()

def on_listview_row_inserted(self, treemodel, path, iterator):
self.update_set_wallpaper_button_state()

def on_listview_rows_reordered(self, treemodel, path, iterator, new_order):
self.update_set_wallpaper_button_state()

def update_set_wallpaper_button_state(self):
selection = self.listview.get_selection().get_selected()
if selection[1]!=None : #an item is selected
progress = selection[0].get_value(selection[1], 1)
if(progress == 100):
self.set_wallpaper_button.set_sensitive(True)
else:
self.set_wallpaper_button.set_sensitive(False)
else:
self.set_wallpaper_button.set_sensitive(False)

def create_iconview_model(self):
iconview_model = gtk.ListStore(str, str, str, gtk.gdk.Pixbuf)
return iconview_model




def fill_iconview_model(self, categories, sortmode, pagesize, pagenumber):
if(not (self.thumbs_dloader is None)):
self.thumbs_dloader.stop()
self.thumbs_dloader = ThumbnailDownloader(self.progressbar1, self.iconview_model, self.glwd, categories, sortmode, pagesize, pagenumber)
self.iconview_model.clear()
self.thumbs_dloader.start()




def update_iconview_model(self):
category = self.glwd.get_categories()[self.combo1.get_active()][0]
sortmode = self.glwd.get_sort_by_methods()[self.combo2.get_active()][1]
pagesize = str(self.spin1.get_value_as_int())
pagenumber = "0"
self.fill_iconview_model(category, sortmode, pagesize, pagenumber)




def set_as_wallpaper(self):
selection = self.listview.get_selection().get_selected()
if selection[1]!=None : #an item is selected
filename = selection[0].get_value(selection[1], 3)
client = gconf.client_get_default ()
client.set_string ("/desktop/gnome/background/picture_filename", filename)


def download_selected(self):
selected = self.iconview.get_selected_items()
self.expander1.set_expanded(True)
for path in selected :
result = None
content_id = self.iconview_model.get_value(self.iconview_model.get_iter(path), MainApp.COL_ID)
wallpaper_name = self.iconview_model.get_value(self.iconview_model.get_iter(path), MainApp.COL_NAME)
download_url = self.glwd.get_download_url(content_id)
mimetype = mimetypes.guess_type(download_url)
if(mimetype[0] != None):
extension = mimetypes.guess_extension(mimetype[0])
if(mimetype[0].startswith("image")):
target_file = wallpaper_name + extension
target_file = str.replace(target_file,"/","-")
target_file = str.replace(target_file,"\\","-")
download_filename = self.save_file_quick(target_file)
if(download_filename != None):
try:
tmp_file = urllib2.urlopen(download_url)
dh = DownloadHandler(self.listview_model, download_filename, download_url, target_file)
dh.start()
result = download_filename

except urllib2.URLError as error:
self.show_http_error(download_url, error)


else:
self.show_unknown_mimetype_dialog(download_url)
else:
self.show_unknown_mimetype_dialog(download_url)
return result




def save_file(self, target_name):
filename = self.show_save_dialog(target_name)
overwrite = False
while( (filename!=None) and os.path.exists(filename) and (not overwrite) ):
if(self.overwrite_file(filename)):
overwrite = True
else:
filename = self.show_save_dialog(target_name)
return filename

def save_file_quick(self, target_name):
filename = os.path.join(self.filechooser_button.get_filename(), target_name)
if(os.path.exists(filename)):
if(not self.overwrite_file(filename)):
return self.save_file(target_name)
return filename



#GUI Events:
def on_refresh_button_clicked(self, widget):
self.update_iconview_model()

def on_close_button_clicked(self, widget):
self.main_quit(widget)

def on_about_button_clicked(self, widget):
self.show_about_dialog()

def on_save_button_clicked(self, widget):
self.download_selected()

def on_set_wallpaper_button_clicked(self, widget):
self.set_as_wallpaper()

def on_clear_completed_button_clicked(self, widget):
self.remove_completed_from_listview_model()

#Dialogs stuff:

def show_save_dialog(self, current):
dialog = gtk.FileChooserDialog("Save..", self.window, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)

filter = gtk.FileFilter()
filter.set_name("All files")
filter.add_pattern("*")
dialog.add_filter(filter)

filter = gtk.FileFilter()
filter.set_name("Images")
filter.add_mime_type("image/png")
filter.add_mime_type("image/jpeg")
filter.add_mime_type("image/gif")
filter.add_pattern("*.png")
filter.add_pattern("*.jpg")
filter.add_pattern("*.gif")
filter.add_pattern("*.tif")
filter.add_pattern("*.xpm")
dialog.add_filter(filter)

dialog.set_current_name(current)

response = dialog.run()

if response == gtk.RESPONSE_OK:
result = dialog.get_filename()
elif response == gtk.RESPONSE_CANCEL:
result = None

dialog.destroy()
return result

def overwrite_file(self, filename):
dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, gtk.BUTTONS_YES_NO, "The file: \n\n"+filename+"\n\nalready exists. Overwrite?")
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_YES:
return True
elif response == gtk.RESPONSE_NO:
return False

def show_unknown_mimetype_dialog(self, url):
dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO, None)
markup = "The url: \n\n<b>"+url+"</b>\n\ndoes not seem to point to a valid wallpaper image. Do you want to try to access it using your web browser?"
dialog.set_markup(markup)
response = dialog.run()
if response == gtk.RESPONSE_YES:
webbrowser.open(url)
dialog.destroy()

def show_http_error(self, url, error):
dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, None)
markup = "The following error occucred while thying to access \n"+url+" :\n\n<b>"+ str(error)+"</b>"
dialog.set_markup(markup)
response = dialog.run()
if response == gtk.RESPONSE_CLOSE:
dialog.destroy()


def show_about_dialog(self):
dialog = gtk.AboutDialog()
dialog.set_name(MainApp.APP_NAME)
dialog.set_version(MainApp.APP_VERSION)
dialog.set_copyright(MainApp.APP_COPYRIGHT)
dialog.set_license(MainApp.APP_LICENSE)
dialog.set_wrap_license(True)
dialog.set_authors(MainApp.APP_AUTHORS)
response = dialog.run()
dialog.destroy()


#------------------------------------------------------------------------------
# Class ProgressCellRenderer
# by: GustavoNiemeyer
# from: http://labix.org/snippets/progress-cell
#------------------------------------------------------------------------------
class ProgressCellRenderer(gtk.GenericCellRenderer):

__gproperties__ = {
"percent": (gobject.TYPE_INT, "Percent", "Progress percentage", 0, 100, 0, gobject.PARAM_READWRITE),}

def __init__(self):
self.__gobject_init__()
self.percent = 0

def do_set_property(self, pspec, value):
setattr(self, pspec.name, value)

def do_get_property(self, pspec):
return getattr(self, pspec.name)

def on_render(self, window, widget, background_area,
cell_area, expose_area, flags):
x_offset, y_offset, width, height = self.on_get_size(widget, cell_area)
widget.style.paint_box(window, gtk.STATE_NORMAL, gtk.SHADOW_IN,
None, widget, "trough",
cell_area.x+x_offset, cell_area.y+y_offset,
width, height)
xt = widget.style.xthickness
xpad = self.get_property("xpad")
space = (width-2*xt-2*xpad)*(self.percent/100.)
widget.style.paint_box(window, gtk.STATE_PRELIGHT, gtk.SHADOW_OUT,
None, widget, "bar",
cell_area.x+x_offset+xt,
cell_area.y+y_offset+xt,
int(space), height-2*xt)

def on_get_size(self, widget, cell_area):
xpad = self.get_property("xpad")
ypad = self.get_property("ypad")
if cell_area:
width = cell_area.width
height = cell_area.height
x_offset = xpad
y_offset = ypad
else:
width = self.get_property("width")
height = self.get_property("height")
if width == -1: width = 100
if height == -1: height = 30
width += xpad*2
height += ypad*2
x_offset = 0
y_offset = 0
return x_offset, y_offset, width, height

gobject.type_register(ProgressCellRenderer)

#------------------------------------------------------------------------------
# End of class ProgressCellRenderer
#------------------------------------------------------------------------------




gtk.gdk.threads_init()
hwg = MainApp()
gtk.main()


Αρχείο wallpapers.glade:
Κώδικας: Επιλογή όλων

<?xml version="1.0"?>
<glade-interface>
<!-- interface-requires gtk+ 2.16 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="window1">
<property name="width_request">585</property>
<property name="height_request">480</property>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="border_width">10</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkNotebook" id="notebook1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<widget class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkVBox" id="vbox3">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkVBox" id="vbox8">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">4</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<child>
<widget class="GtkVBox" id="vbox5">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="border_width">4</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="label4">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Wallpaper type:</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox6">
<property name="width_request">100</property>
<property name="visible">True</property>
<property name="border_width">4</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Sort by:</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<child>
<widget class="GtkVBox" id="vbox4">
<property name="width_request">150</property>
<property name="visible">True</property>
<property name="border_width">4</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Number of wallpapers:</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkSpinButton" id="spinbutton1">
<property name="width_request">20</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">&#x25CF;</property>
<property name="adjustment">50 10 110 1 10 10</property>
<property name="climb_rate">10</property>
<property name="numeric">True</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button3">
<property name="label" translatable="yes">gtk-refresh</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox6">
<property name="visible">True</property>
<property name="border_width">8</property>
<child>
<widget class="GtkHSeparator" id="hseparator1">
<property name="visible">True</property>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<child>
<widget class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="label" translatable="yes">Save to: </property>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkFileChooserButton" id="filechooserbutton2">
<property name="visible">True</property>
<property name="action">select-folder</property>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkFixed" id="fixed1">
<property name="width_request">30</property>
<property name="visible">True</property>
</widget>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox2">
<property name="visible">True</property>
<property name="spacing">2</property>
<property name="layout_style">end</property>
<child>
<widget class="GtkButton" id="button4">
<property name="label" translatable="yes">gtk-save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkVBox" id="vbox7">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkExpander" id="expander1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<widget class="GtkVBox" id="vbox9">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow2">
<property name="height_request">200</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox3">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<widget class="GtkButton" id="button6">
<property name="label" translatable="yes">gtk-clear</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button5">
<property name="label" translatable="yes">Set as wallpaper</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Downloads in progress:&lt;/b&gt;</property>
<property name="use_markup">True</property>
</widget>
<packing>
<property name="type">label_item</property>
</packing>
</child>
</widget>
<packing>
<property name="position">0</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="label" translatable="yes">&lt;b&gt;Wallpapers::gnome-look.org&lt;/b&gt;</property>
<property name="use_markup">True</property>
</widget>
<packing>
<property name="tab_fill">False</property>
<property name="type">tab</property>
</packing>
</child>
</widget>
<packing>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="layout_style">edge</property>
<child>
<widget class="GtkButton" id="button1">
<property name="label" translatable="yes">gtk-about</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="button2">
<property name="label" translatable="yes">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
Τελευταία επεξεργασία από cyberpython και 26 Νοέμ 2010, 22:13, έχει επεξεργασθεί 1 φορά/ες συνολικά
Κοινότητα ΕΛ/ΛΑΚ Οικονομικού Πανεπιστημίου Αθηνών / Ubuntu-gr / My Web Log
Επίπεδο Γνώσεων Linux: Μέτριο, Προγραμματισμός: Ναι, Aγγλικά: Καλά
Λειτουργικό : Ubuntu 10.04 - 32bits
Η/Υ : Intel Core2 4400@2 GHz / 2GB DDR2 RAM / GeForce 8400 GS 512MB / Creative SB Audigy SE
Άβαταρ μέλους
cyberpython
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 733
Εγγραφή: 14 Μάιος 2008, 13:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό RestlessKing » 15 Αύγ 2009, 22:58

DarkLord έγραψε:ρε παιδιά ξέρει κανείς τι είναι τα classes ???
με έχουν μπερδέψει αρκετά!!


Καποια βασικά για να πιάσετε την ιδέα:
κλασσική αναλογία για να κατανοήσετε τον OOp είναι αυτή με το αμάξι.
Υποθέστε λοιπόν ότι οδηγάτε το αυτοκίνητο σας και θέλετε να πάτε πιο γρήγορα. Γι αυτό πατάτε περισσότερο το
γκάζι. Τόσο απλό.

Τι πρέπει να προηγηθεί όμως πριν μπορέσετε να το κάνετε αυτό ;

1) Πρέπει να κατασκευαστεί το αυτοκίνητο.
2) Για να κατασκευαστεί το αυτοκίνητο πρέπει να υπάρχουν μηχανολογικά σχέδια αυτού.
3) Αυτά τα σχέδια, περιλαμβάνουν τα σχέδια για το γκάζι, το φρένο, το τιμόνι κλπ κλπ.

Κατά μία έννοια λοιπόν, το πετάλι για το γκάζι/φρενο κλπ, στην ουσία "κρύβει" τον μηχανισμό της επιτάχυνσης
του αυτοκινήτου. Ετσι, όλος ο κόσμος ξέρει να οδηγάει πολύ εύκολα, χωρίς να γνωρίζει πως λειτουργεί ένα
αυτοκίνητο.

Αυτός ο μηχανισμός γίνεται μέσω μιας function. Η function περιέχει όλα αυτά τα σχέδια της επιτάχυνσης ώστε oταν πατάμε το πετάλι του γκάζι, το αυτοκίνητο να επιταχύνει. Υπάρχει επίσης μια άλλη function, η οποία περιέχει τον μηχανισμό για να σταματάει το αμάξι όταν πετάμε φρένο. Ακόμα, υπάρχει κι άλλη function που περιέχει τον μηχανισμό για να στρίβουμε το αμάξι με το τιμόνι. Όλες αυτές οι functions περιέχουν του μηχανισμούς για λειτουργίες του αυτοκινήτου.

Τον οδηγό όμως, δεν τον ενδιαφέρει ο μηχανισμός αλλά η λειτουργία της function (δηλαδή να γκαζώνει, να φρενάρει και στρίβει).

Class, λοιπόν, είναι μια συλλογή - ένα σπίτι - που στεγάζει αυτές τις functions, σαν το σπίτι του μηχανικου που έχει στο γραφείο του
τα σχέδια του νέου μοντέλου αμαξιού της εταιρίας. Σε μία class μπορείς να έχεις μέσα της, 1 ή και περισσότερες member function. Όλες τους
όμως, όπως είπαμε, θα περιέχουν μηχανισμούς που αφορούν λειτουργίες της Class. Όπως τα σχέδια του μηχανικού (σχεδιο για το γκαζι, σχέδιο για το φρενο κλπ) λειτουργίες του αυτοκινήτου.
Όμως δεν μπορούμε να οδηγήσουμε τα σχέδια. Δεν μπορούμε να πατήσουμε το γκάζι πάνω στην κόλα Α2 που σχεδιάσαμε το γκάζι και να πάρει κινηθεί
το αυτοκίνητο στη ζωγραφιά-σχέδιο. Πρέπει λοιπόν, κάποιος, να κατασκευάσει ένα πραγματικό αυτοκίνητο. Να περάσει από το χαρτί στην
πραγματικότητα της ζωής μας. Έτσι, λοιπόν, αφού έχουμε τα μηχανολογικά σχέδια (δηλαδή την Class), φτιάχνουμε ένα αυτοκίνητο
(δηλαδή ένα Object της Class). Φυσικά μπορούμε να φτιάξουμε 1 και περισσότερα αυτοκίνητα από ένα σχέδιο - άρα μπορούμε να φτιάξουμε ένα ή
και περισσότερα Objects από μια Class. Η Class - δηλαδή τα μηχανολογικά σχέδια του αυτοκινήτου - περιέχουν τους μηχανισμούς
(member functions) οι οποίεις θα υλοποιηθούν με την σειρά τους στο αυτοκίνητο που θα κατασκευάσουμε (δηλαδή το Object).Όταν
πατάτε το γκάζι, τότε στην ουσία καλείται μία λειτουργία του αυτοκινήτου : την επιτάχυνση. Ανάλογα, στην C++, στέλνετε μυνήματα στο
Object (αυτοκίνητο)για να επιταχύνει. Αυτή η διαδικασία της "κλήσης" ενός μηχανισμού/ μιας λειτουργίας(member function) της
Class(μηχανολογικα σχέδια αυτοκινήτου) για να υλοποιηθεί από το Object(αυτοκίνητο) λέται member-function call ή αλλιώς Object Service Request. Κάθε
αυτοκίνητο όμως, έχει το δικό του χρώμα, το δικό το σαλόνι, το δικό του max ταχύτητας, ξεχωριστή δεξαμενή καυσιμων κλπ. Μπορεί να είναι
αυτοκίνητο που προέρχεται από το ίδιο μηχανολογικό σχέδιο. Toyota Auris θα βρείς σε πολλά μοντέλα. Όλα όμως προέρχονται από το ίδιο
σχέδιο. Είναι απλώς διαφορετικά μοντέλα. Σε τι διαφέρουν δηλαδή ; Στις ιδιότητες (attributes). Αρα κάθε object που μπορεί να προέρχεται από
μια Class μπορεί να διαφοροποιείται από ένα Object που προέρχεται από την ίδια Class, γιατί θα έχει διαφορετικά attributes (πχ διαφορετικό
χρωμα). Προσέξτε όμως, οι ιδιότητες (attributes) ΔΕΝ ΕΙΝΑΙ μέρος του μηχανολογικού σχεδιού (δηλαδή της Class) αλλά είναι μέρος που
στεγάζεται στο Object καθ' αυτό. Εν ολίγης, function (member function) : Ο μηχανισμός που υλοποιεί τις διάφορες λειτουργίες
ενός προγράμματος. Το "πώς" της υλοποιεί, παραμένει "κρυφό" μέσα στην function και δεν σας ενδιαφέρει. Class είναι μια συλλογή απο
πληροφορίες - λειτουργίες - μηχανισμούς, που "κρύβονται" μέσα στις member functions (δηλαδή functions που είναι μέλη της Class). Object
είναι αντίτυπο (instance) - υλοποίηση της Class. πχ ενα αυτοκίνητο που έχει μονο γκάζι. πχ ένα αλλό που έχει και γκαζι και φρένο. Attributes είναι οι ιδιότητες του κάθε αντικειμένου ξεχωριστά (πχ το χρώμα του).

Είναι μία συλλογή από ιδιότητες. Φανταστείτε κάτι σαν τα σχέδια ενός μηχανικού.
Απλά να ξέρετε ότι είναι μία συλλογή από ιδιότητες, τίποτα παραπάνω για την ώρα.
Εύκολος ορισμός ε ;

Κάθε class έχει 2 πράγματα: Μεταβλητές και Συναρτήσεις (Variables & Functions)

Οι variables(μεταβλητές) που βρίσκονται μέσα σε μία class έχουν ένα ειδικό όνομα.
Λέγονται: Member Variables ή Data Members.

Οι Συναρτήσεις( functions) που βρίσκονται μέσα σε μία class έχουν κι αυτές ένα ειδικό όνομα
Λέγονται: Member Functions ή Methods.
################################################## ##########

Παράδειγμα: πχ έστω ότι έχουμε μια class Gatoula()
Αυτή πιθανόν να περιέχει τα εξής:
Member Variables: int ilikia, char xroma, char ratsa, char xroma_mation, klp klp
Member Functions: void Niaourisma(), void Upnos(), void Perpatima() , void Kunigi_Pontikion() klp klp


Παράδειγμα μιας class ακολλουθεί ακριβως παρακάτω ::::

Κώδικας: Επιλογή όλων


class Gatoula
{
unsigned int IlikiaTis;
unsigned int VarosTis;
void Niaou();
};
Όταν η δύναμη της αγάπης ξεπεράσει την αγάπη για τη δύναμη τότε ο κόσμος θα γνωρίσει την ειρήνη --- Jimmy Hendrix
Άβαταρ μέλους
RestlessKing
babeTUX
babeTUX
 
Δημοσιεύσεις: 17
Εγγραφή: 04 Αύγ 2009, 14:10
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό DarkLord » 24 Αύγ 2009, 11:55

Livescores superleage
ένα ωραίο scripaki για να βλέπεις τα σκορ της superleage

Κώδικας: Επιλογή όλων
#!/usr/bin/env python
# encoding: utf-8
#====================================================================
# Name :
# livescore.py
# Version :
# v0.1c
# Author :
# WorldCitizeN
# Date :
# 2009-05-26
# Description :
# Shows the Results of Football Games
# using data from
#
# http://livescores.com/default.dll?page=greece
#
#====================================================================
import sys
import urllib2
import HTMLParser

__author__ = "WorldCitizeN"
__version__ = "0.1c"

def help_():
return """# livescore.py v0.1c
# Author :
# WorldCitizeN
# Description :
# A simple Python Script which
# shows the live results using data from
# http://livescores.com/default.dll?page=greece

-help
Self Explanatory
-list
Shows the results available, default is the Greek Super Liga
live
Shows all the live results
england
Shows all the results in the English Leagues
"""



# Change color_ to 0 if you do not want
# a colored output.
color_ = 1

url = 'http://livescores.com/default.dll?page='

def Beautify(data, length_):
return (data.strip() + " "*100)[:length_]

def urldata(url_, data_=None):
"""Returns HTML code from url."""
return urllib2.urlopen(urllib2.Request(url_, data_)).read()


class Spider(HTMLParser.HTMLParser):

def __init__(self, fed, tag = 'td', fn = None):
HTMLParser.HTMLParser.__init__(self)
self.data = [ [], [], [], [] ] # [ [Time], [Home Team], [Score], [Guest Team] ]
self.tabs = [ 8, 20, 8, 20 ] # Identation for self.data
self.ps = 0 # Type of self.data currently read
self.NGames = 0 # Number of Games Currently paresed
self.TmpStr = "" # Temporary String
self.GotStr = 0 # Identifier for League and Date

self.Leagues = dict()
self.Dates = dict()
self.Info = [self.Leagues, self.Dates]

self.Links = []
self.GotLinks= 0
self.feed(fed)
self.data = zip(*self.data)

self.Links = self.Links[2:-3]

tmp = sorted(self.Leagues.keys())[::-1]

for i,t in enumerate(tmp):
s2c = "\033[1m"*color_ + self.Leagues[t] + "\033[0m"*color_
try:
s2c += "\n\033[1m"*color_ + self.Dates[t] + "\033[0m"*color_
except:
pass
middle = " "*int( (sum(self.tabs) - len(self.Leagues[t]))/2 )
self.data = self.data[:t] + [middle + s2c] + self.data[t:]

def handle_starttag(self, tag, attrs):
if tag == 'td':
if attrs == [('width', '45'), ('height', '18')]:
self.ps = 1
elif attrs == [('align', 'right'), ('width', '118')]:
self.ps = 2
elif attrs == [('align', 'center'), ('width', '50')]:
self.ps = 3
elif attrs == [('width', '118')]:
self.ps = 4
# League Identifier
elif attrs == [('class', 'title'), ('colspan', '4'), ('height', '18')]:
self.GotStr = 1
# Date Identifier
elif attrs[:2] == [('class', 'match-light'), ('align', 'right')]:
self.GotStr = 2
self.tdata = []
if tag == 'a':
if attrs[0][1][:18] == '/default.dll?page=':
self.Links += [[attrs[0][1][18:], ""]]
self.GotLinks= 1

def handle_data(self, data):
if self.ps != 0:
self.data[self.ps-1] += [ (data.strip() + " "*20)[:self.tabs[self.ps - 1]] ]
if self.ps == 1:
self.NGames += 1
self.ps = 0
if self.GotStr != 0:
self.TmpStr += data
if self.GotLinks == 1:
self.Links[-1][1] = data
self.GotLinks = 0

def handle_endtag(self,tag):
if tag == 'td' :
if self.GotStr == 1:
self.Leagues[self.NGames] = self.TmpStr
elif self.GotStr == 2:
self.Dates[self.NGames] = self.TmpStr
if self.GotStr != 0:
self.TmpStr = ""
self.GotStr = 0
pass


def ShowGames(country):
for iG, Game in enumerate(Spider(urldata(url + country)).data):
print( "".join(Game))
return

def GameList_():
links_ = Spider(urldata(url)).Links
for link_ in links_:
l0, l1 = Beautify(link_[0],12), Beautify(link_[1],12)
print( l1 +" : "+ "\033[1m"*color_ + l0 + color_*"\033[0m")
print( "eg. \"livescore.py soccer\" for All Soccer Games ")
return

def main():
if len(sys.argv) > 1:
if sys.argv[1] == '-list' or sys.argv[1] == '-l':
GameList_()
elif sys.argv[1] == '-help' or sys.argv[1] == '-h':
print( help_())
else:
ShowGames(sys.argv[1])
else:
ShowGames("greece")




if __name__ == '__main__':
# print("Data taken from%s"%url)
main()

DarkLord
babeTUX
babeTUX
 
Δημοσιεύσεις: 81
Εγγραφή: 24 Ιαν 2009, 15:26
Τοποθεσία: Karvasaras
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό dimosfire » 13 Οκτ 2009, 14:48

@restlessKing
θαυμάσιο άρθρο για τις τάξεις και τις συναρτήσεις.Συγχαρητήρια.
ubuntu 9.10 (AMD64),Innovator desktop, motherboard MSI K8N NEO4-F,cpu AMD ATHLON64 3500+ 2.20GHz,ram 1GHz, καρτα γραφ.GIGABYTE GEFORCE 6600 256MB,καρτα τηλεορ.κ radio FM PROLINK PIXELVIEW PLAYTV PRO/ΑΓΓΛΙΚΑ-ΚΑΛΑ/ΓΝΩΣΕΙΣ ΠΡΟΓΡ.-ΚΑΘΟΛΟΥ.
dimosfire
babeTUX
babeTUX
 
Δημοσιεύσεις: 141
Εγγραφή: 02 Φεβ 2009, 11:07
Τοποθεσία: ΠΑΤΡΑ
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 22 Οκτ 2009, 22:13

Μια έκδοση της Κρεμάλας (Hangman) που έφτιαξα
κανονικά :arrow: http://en.wikipedia.org/wiki/Hangman_(game)
μόλις ο παίκτης μαντέψει ένα γράμμα του εμφανίζονται και όλα τα ίδια γράμματα της λέξης ( αν υπάρχουν )
σε αυτή την εκδοχή όμως ... τα πράγματα είναι πιο δύσκολα :P
Enjoy :)
Κώδικας: Επιλογή όλων
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Copyright : 2009 Giannis fysakis <giannisfs at gmail dot com >
#This is free software. You may redistribute copies of it under the terms of
#the GNU General Public License <http://www.gnu.org/licenses/GPL.html>
#There is NO WARRANTY, to the extent permitted by law.
#Notes : Typically in a hangman game as soun as the player founds at least one letter the game
# exposes all similar letters ... Well this version ... makes it harder to guess :P

from sys import exit

from random import choice

def dots(a="*"): print a*50

def Hang(status):
if status ==0:
print """
_____
|
|
|
|
"""
if status == 1:
print """
_____
| 0
| |\\
|
|
"""
if status == 2:
print """
_____
| 0
| /||\\
|
|
"""
if status == 3:
print """
_____
| 0
| /||\\
| /
|
"""
if status == 4:
print """
_____
| 0
| /||\\
| /\\
|
"""
if status == 5:
print """
_____
| 0 /
| /||\\ /
| /\\ y
| \\/\///\\
"""
if status == 6:
print """
_____
| 0
| /||\\w
| /\\WW
|wWwwW
WwWwWW
"""

def mask (original,masked):

msk = []
try:
for i,v in enumerate( masked):
if v in original:
msk.append("_")
elif v not in original:
msk.append(original[i])
except IndexError:
pass
return msk


def main ():
dots()
word = choice(["kitchen","mountain","system", "amplify","tomato"])
word = word.lower()
bkp = word
MaxTries=len(word) * 5
Completed= False
lost =0
found =0
Try=0
wrongs=0

dots()
print "\n\tWelcome to The HAngmAn Game \t\t\n"
dots()
Hang(wrongs)
dots()
print "You Have %d attempts\n" % MaxTries

while not Completed :
guess = raw_input("Give a letter\n")
Try +=1

print "You have done %d attempts till now !!! \n " % Try
if guess == word :
dots()
dots()
print " TILT TILT WELL DONE YOU FIND IT BRAVO BRAVO ! !!"
dots()
dots()
Completed = True
break
if word.count(guess) > 1 and guess != '':
dots()
print "\t \n HINT>> %s is %d times in the word <<HINT " % (guess , word.count(guess))
dots()

while guess in """`~!@#$%^&*()_+|-=\{}[]:";'<>?,.// \n """ or guess =="":
guess = raw_input("\nPlease Give Just a letter -->: ")
Try +=1
dots(a="_")
print "Attempts Still Count !!! you have Tried: %d Times till now" % Try

if Try == MaxTries -1 :
Completed = True
break
guess = " "

if guess not in word:
print "Unfortunately %s is not in the Word :( \n " % guess
lost +=1
wrongs += 1
dots()
Hang(wrongs)
dots()

if guess in bkp and bkp.count(guess)<len(word)/2:


found+=1
pos = bkp.find(guess)
bkp =bkp.replace(guess,'$',1)

hidden = mask(word,bkp)


print "You have lost %d and Found %d " % (lost, found)
print "You have done %d attempts till now !!! \n " % Try
print hidden ,"\n"


if "_" not in hidden:
Completed =True
dots("$")
print "\n Gongratulation you Won!! \n at the %d attempt " % Try
print " Bye bye\n"
dots("$")
break
exit

if wrongs >5 or Try == MaxTries -1:
Completed =True
dots()
print "\t\tBye bye\n"
dots()
print """\nThe Score is
%d Attempts %d lost %d Found
""" % ( Try , lost ,found)
dots()

exit
else:
print ";)"







if __name__ == '__main__':

main()
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό cyberpython » 25 Οκτ 2009, 20:56

sokoban4ever έγραψε:
κανονικά μόλις ο παίκτης μαντέψει ένα γράμμα του εμφανίζονται και όλα τα ίδια γράμματα της λέξης ( αν υπάρχουν ) σε αυτή την εκδοχή όμως ... τα πράγματα είναι πιο δύσκολα :P


Βασικά είναι λίγο εκνευριστικό (ειδικά αν υπάρχει πολλές - πάνω από 2 - φορές το ίδιο γράμμα) :D
Κοινότητα ΕΛ/ΛΑΚ Οικονομικού Πανεπιστημίου Αθηνών / Ubuntu-gr / My Web Log
Επίπεδο Γνώσεων Linux: Μέτριο, Προγραμματισμός: Ναι, Aγγλικά: Καλά
Λειτουργικό : Ubuntu 10.04 - 32bits
Η/Υ : Intel Core2 4400@2 GHz / 2GB DDR2 RAM / GeForce 8400 GS 512MB / Creative SB Audigy SE
Άβαταρ μέλους
cyberpython
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 733
Εγγραφή: 14 Μάιος 2008, 13:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό sokoban4ever » 25 Οκτ 2009, 21:44

@cyberpython
:think: Όμως με λέξεις όπως Pneumonoultramicroscopicsilicovolcanoconiosis :lol:
θα είναι καλή εξάσκηση για ... γιατρούς ... :P
( http://en.wikipedia.org/wiki/Longest_word_in_English )
Θέλουμε και μπορούμε να έχουμε μια καλύτερη ζωή και όσο θα ζούμε θα προσπαθούμε να την αποκτήσουμε ακόμα και αν πεθάνουμε προσπαθώντας, και αν κάποια στιγμή λιγίσουμε έχουμε το επίπεδο να πούμε κουράστηκα λίγο να ,να ξαποστάσουμε , ώστε να συνεχίσουμε πάλι δυνατοί ξανά.

Μήνυμα με αγάπη και αληλλεγγύη σε όλους τους ανθρώπους από όλους τους λαούς , ιδίως του Ελληνικού.
Άβαταρ μέλους
sokoban4ever
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 2331
Εγγραφή: 13 Φεβ 2009, 02:22
Εκτύπωση

Re: Τα πάντα για την Python

Δημοσίευσηαπό DarkLord » 07 Φεβ 2010, 20:05

Καλησπέρα σε όλους !!!

έχω φτιάξει ένα script σε python το οποίο χρησιμοποιεί το module htmlparser ώστε να κατεβάζω κάποια δεδομένα απο
μια σελίδα

το αποτέλεσμα είναι να μου βγάζει τους Ελληνικούς χαρακτήρες όπως φαίνεται παρακάτω
Κώδικας: Επιλογή όλων
13 ������� ����� ������������ ����� ��� ������:: 9 ����, 2 �� ������ ��� 2 ���������� :: 1 ������ ���������
DarkLord
babeTUX
babeTUX
 
Δημοσιεύσεις: 81
Εγγραφή: 24 Ιαν 2009, 15:26
Τοποθεσία: Karvasaras
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι