Το πρόγραμμά μου δέχεται 2 φακέλους από το χρήστη (έναν source και έναν destination) και αναλαμβάνει να αντιγράψει όλα τα αρχεία του source φακέλου στον destination, ελέγχοντας πρώτα το κάθε αρχείο αν υπάρχει, αν έχει το ίδιο μέγεθος, κλπ. Μέχρι εδώ καλά. Το θέμα μου είναι ότι κατά τη διαδικασία της αντιγραφής θέλω στον χρήστη να εμφανίζεται ένα μήνυμα του στυλ "Παρακαλώ περιμένετε" και ένα spinner. Όταν τελειώσει η αντιγραφή, θα πετάγεται ένα μήνυμα που θα λέει "Τέλος!" ξέρω γω... Μετά από αρκετές προσπάθειες κατάλαβα ότι μάλλον για να γίνουν 2 δουλειές ταυτόχρονα χρειάζεται multiprocessing (μπορεί και όχι, και να δυσκολεύω τη ζωή μου χωρίς λόγο, αλλά δε βρήκα άλλο τρόπο). Όρισα λοιπόν μία Process για την αντιγραφή των αρχείων και μια για τον spinner. Μετά από επίσης αρκετές προσπάθειες κατάφερα να βρω έναν τρόπο με τα events να ελέγχω πότε τελειώνει η αντιγραφή.
Το πρόβλημά μου είναι ότι το spinner ποτέ δεν εμφανίζεται, ενώ η διαδικασία (απ'όσο καταλαβαίνω) εκτελείται κανονικά (στο τερματικό εμφανίζεται το μήνυμα "spinner running").
Παρακάτω έχω αντικαταστήσει τη διαδικασία αντιγραφής αρχείων με μια άλλη που απλά δείχνει την εξέλιξή της εμφανίζοντας στην οθόνη 4 μηνύματα με διαφορά 1 sec.
Επίσης, η αντιγραφή ξεκινάει με το πάτημα του synchbutton, και το spinner εμφανίζεται στο ίδιο παράθυρο (mainwindow).
Όποιος μπορεί, ας βοηθήσει παρακαλώ, μια συμβουλή / ένα link / κάτι, γιατί έχω σκαλώσει άγρια...
- Κώδικας: Επιλογή όλων
#! /usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
import threading
import thread
from multiprocessing import Process, Event
import time
def copying () :
print("Copying...")
time.sleep(1)
print("Copying...")
time.sleep(1)
print("Copying...")
time.sleep(1)
print("Copying...")
time.sleep(1)
return True
class Synchronaiz() :
def __init__(self) :
builder = gtk.Builder()
builder.add_from_file("synchronaiz.glade")
self.mainwindow = builder.get_object("mainwindow")
self.donewindow = builder.get_object("donewindow")
self.statuslabel = builder.get_object("statuslabel")
self.spinner = builder.get_object("spinner")
builder.connect_signals(self)
def on_window_destroy(self, widget, data=None) :
gtk.main_quit()
def on_synchbutton_clicked(self, widget, data=None) :
def startSpinner() :
self.statuslabel.set_text(u'Synching... It may take a few minutes.')
self.spinner.show()
self.spinner.start()
print("spinner running.")
def startCopying(event) :
isdone = False
isdone = copying()
if (isdone == True) :
event.set()
def checkCopying(event, killEvent) :
event.wait()
print("Copying is done.")
killEvent.set()
event = Event()
event.clear()
killEvent = Event()
spin = Process(target=startSpinner(), args=())
spin.start()
cop = Process(target=startCopying, args=(event, ))
cop.start()
t = threading.Thread(target=checkCopying, args=(event, killEvent))
t.start()
try :
while not killEvent.is_set() :
pass
finally :
cop.terminate()
spin.terminate()
self.mainwindow.hide()
self.donewindow.show()
if __name__ == '__main__' :
synch = Synchronaiz()
synch.mainwindow.show()
gtk.main()



