Δημοσιεύτηκε: 22 Οκτ 2011, 03:00
από Phantomas
Νομίζω ότι το προσεγγίζεις πάρα πολύ πολύπλοκα, χωρίς λόγο... Πρέπει να έχεις μια αγάπη προς τις συναρτήσεις, τις χρησιμοποιείς σε σημεία που δεν χρειάζονται καν! Δεν ξέρω τι ακριβώς κάνει η copying() σου, αφού μας την "έκρυψες" :) αλλά αν κατάλαβα καλά πρέπει να επιστρέφει True όταν έχει πετύχει η αντιγραφή και False όταν αυτή αποτυγχάνει, ίσως αν αντικαταστήσεις όλη την on_synchbutton_clicked με κάτι σαν το παρακάτω, να παίζει όπως θες...

Κώδικας: Επιλογή όλων
def on_synchbutton_clicked(self, widget, data=None):

self.statuslabel.set_text(u'Synching... It may take a few minutes.')
self.spinner.show()
self.spinner.start()

# Start Copying
result = copying()
if result is True:
print("Copying is done.")
# More action to do when copying succeeds
else:
print("Error.")
# More action to do when copying has failed

print("Telos.")
self.spinner.stop()


Απλά να θυμάσαι ότι καλές οι συναρτήσεις (όχι όμως αυτό που είχες κάνει με συνάρτηση μέσα σε συνάρτηση μέσα σε συνάρτηση) αλλά όταν κάτι γίνεται με απλές εντολές στη σειρά, το προτιμάς, γενικά! Το multi-threading εδώ πέρα δεν χρειάζεται καθόλου, ΔΕΝ κάνεις 2 πράγματα παράλληλα... αυτό που θες να κάνεις μόλις ο χρήστης πατήσει το κλικ είναι:
1) Να εμφανίσεις το spinner
2) Να το ξεκινήσεις
3) Να κάνεις την αντιγραφή (με τη συνάρτηση copying απ' ό,τι κατάλαβα) και να πάρεις το αποτέλεσμα από τη return της
4) Να εκμεταλλευτείς το αποτέλεσμα της copying και να εμφανίσεις το αντίστοιχο μήνυμα (πέτυχε/δεν πέτυχε) ή/και να κάνεις άλλες ενέργειες που θες
5) Να σταματήσεις το spinner (ίσως και να το κρύψεις με self.spinner.hide())

Εσύ μάλλον προσπαθούσες να τα κάνεις όλα αυτά τα βήματα παράλληλα σε 1... αλλά ο υπολογιστής είναι πολύ πιο γρήγορος από ότι ίσως υπέθετες, οπότε μεταξύ βήματος 2 και 3 π.χ. ο χρόνος είναι πραγματικά μηδενικός! :)