Δημοσιεύτηκε: 24 Οκτ 2011, 16:20
από parenthesis
Phantomas έγραψε:Είσαι σίγουρη ότι έλεγες στο spinner να ξεκινήσει πριν αρχίσεις την αντιγραφή; Θα ήθελα να δω τον κώδικα που λες (χωρίς multi-threading) μαζί με τη συνάρτηση copying για να μπορέσουμε να βγάλουμε άκρη. Πάντως το multi-threading είναι σίγουρα λάθος προσέγγιση για αυτό που θες!


Λοιπόν, ο κώδικας είναι :
Κώδικας: Επιλογή όλων
#! /usr/bin/env python

import os, sys
import shutil
import pygtk
pygtk.require('2.0')
import gtk

def copy_file(sf, df) :
# Copy given file to given path
shutil.copyfile(sf, df)

def copy_them(sourcef, destf) :
source_list = os.listdir(sourcef)
dest_list = os.listdir(destf)
# Iterate through the source directory
for filename in source_list :
outfile = destf + '/' + filename
infile = sourcef + '/' + filename
if (os.path.exists(outfile)) :
# Check if file already exists in destination directory
if (os.path.getsize(infile) != os.path.getsize(outfile)) :
# If it exists, check whether it has the same size.
if os.path.isdir(infile) :
# Check if infile is a directory
copy_them(infile, outfile)
else:
copy_file(infile, outfile)
else :
pass
else :
if os.path.isdir(infile) :
# Check if infile is a directory
os.mkdir(outfile)
copy_them(infile, outfile)
else:
copy_file(infile, outfile)
return True

class Synchronaiz() :

def __init__(self) :
builder = gtk.Builder()
builder.add_from_file("synchronaiz.glade")

self.mainwindow = builder.get_object("mainwindow")
self.sourcechooser = builder.get_object("sourcechooser")
self.destinationchooser = builder.get_object("destinationchooser")
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) :

sourcef = self.sourcechooser.get_filename()
destf = self.destinationchooser.get_filename()

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

isdone = False
isdone = copy_them(sourcef, destf)
if (isdone == True) :
self.statuslabel.set_text(u'')
self.spinner.stop()
self.donewindow.show()

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


Πρώτα ξεκινάει η αντιγραφή των αρχείων, και μόλις τελειώσει εμφανίζεται το spinner.

Επίσης παραθέτω και το αρχείο .glade (λίγο πρόχειρο, αλλά anyway...) :
Spoiler: show
Κώδικας: Επιλογή όλων
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkDialog" id="donewindow">
<property name="can_focus">False</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Done!</property>
<property name="resizable">False</property>
<property name="window_position">center</property>
<property name="type_hint">dialog</property>
<signal name="destroy" handler="on_window_destroy" swapped="no"/>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="exbutton">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="border_width">8</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_window_destroy" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="donelabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Synching finished!</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">exbutton</action-widget>
</action-widgets>
</object>
<object class="GtkWindow" id="mainwindow">
<property name="width_request">450</property>
<property name="height_request">400</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Main Window</property>
<property name="resizable">False</property>
<property name="window_position">center</property>
<property name="urgency_hint">True</property>
<signal name="destroy" handler="on_window_destroy" swapped="no"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="statuslabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Welcome to Synchronaiz!</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="choosesource">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Please choose the source : </property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="sourcechooser">
<property name="height_request">10</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">20</property>
<property name="action">select-folder</property>
<property name="create_folders">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="choosedestination">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Please choose destination : </property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="destinationchooser">
<property name="height_request">10</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">20</property>
<property name="action">select-folder</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="padding">8</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkSpinner" id="spinner">
<property name="height_request">20</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">9</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">15</property>
<child>
<object class="GtkButton" id="synchbutton">
<property name="label" translatable="yes">Synch!</property>
<property name="height_request">10</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="border_width">25</property>
<property name="use_action_appearance">False</property>
<signal name="clicked" handler="on_synchbutton_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="exibutton">
<property name="label">gtk-quit</property>
<property name="height_request">10</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="border_width">25</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_window_destroy" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</interface>