Δημοσιεύτηκε: 22 Οκτ 2011, 15:10
από parenthesis
Phantomas έγραψε:
Spoiler: show
Νομίζω ότι το προσεγγίζεις πάρα πολύ πολύπλοκα, χωρίς λόγο... Πρέπει να έχεις μια αγάπη προς τις συναρτήσεις, τις χρησιμοποιείς σε σημεία που δεν χρειάζονται καν! Δεν ξέρω τι ακριβώς κάνει η 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 π.χ. ο χρόνος είναι πραγματικά μηδενικός! :)


Σαφώς και έτσι ξεκίνησα αρχικά να το κάνω, αφού ούτως ή άλλως δεν είχα ιδέα από multithreading και λοιπά, αλλά δεν πιάνει! Αν το κάνω έτσι όπως λες, αρχίζει να τρέχει η copying(), και το spinner εμφανίζεται αφού αυτή τελειώσει! Δεν ξέρω γιατί συμβαίνει αυτό, και μετά υπέθεσα ότι μάλλον πρέπει με κάποιο τρόπο να τα "εξαναγκάσω" να τρέξουν με τη σειρά που θέλω...
Εκτός κι αν πάλι κάνω καμιά πατάτα, εσύ το έτρεξες έτσι και δούλεψε; :problem:

btw, το πρόγραμμα αυτή τη στιγμή χωρίς spinner είναι κάπως έτσι (τώρα που ξαναβλέπω τι είχα γράψει, όντως, το παράκανα με τις συναρτήσεις! :P ) :
Κώδικας: Επιλογή όλων
#! /usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk
import threading
import thread
from multiprocessing import Process, Event
import time
import gobject

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 setLabel() :
self.statuslabel.set_text(u'Synching... It may take a few minutes.')

def start_copying() :
isdone = False
isdone = copying()
if (isdone == True) :
self.statuslabel.set_text(u'')
self.mainwindow.hide()
self.donewindow.show()

gobject.timeout_add(100, setLabel)
gobject.timeout_add(200, startCopying, sourcef, destf)

if __name__ == '__main__' :
synch = Synchronaiz()
synch.mainwindow.show()
gtk.main()