Glade + python : εμφάνιση spinner

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

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

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό Phantomas » 23 Οκτ 2011, 16:09

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


Είσαι σίγουρη ότι έλεγες στο spinner να ξεκινήσει πριν αρχίσεις την αντιγραφή; Θα ήθελα να δω τον κώδικα που λες (χωρίς multi-threading) μαζί με τη συνάρτηση copying για να μπορέσουμε να βγάλουμε άκρη. Πάντως το multi-threading είναι σίγουρα λάθος προσέγγιση για αυτό που θες!
Άβαταρ μέλους
Phantomas
punkTUX
punkTUX
 
Δημοσιεύσεις: 156
Εγγραφή: 28 Ιούλ 2008, 15:57
IRC: Phantomas
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό parenthesis » 24 Οκτ 2011, 16:20

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>
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό clepto » 01 Ιούλ 2012, 16:53

Ξέρω ξέρω...παλιό θέμα :P
αλλά έχω και εγώ ένα προβληματάκι...
Μορφοποιημένος Κώδικας: Επιλογή όλων
def my_on_episodetreeview_row_activated(self, widget, path, user_param=None):
manga = self.get_selected_manga(0)
manga_url = self.get_manga_url(manga)
episode_number = self.get_selected_episode()
first_episode_line = self.find_first_episode_line(manga, manga_url)

episode_line = ""
if manga == "High School of the Dead":
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, True)
elif manga == "Kimi Ni Todoke":
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, True)
else:
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, False)

episode_url = self.get_episode_url(manga_url, episode_line)
final_episode_url = "http://www.mangareader.net" + episode_url
pages_number = self.get_pages(final_episode_url)
self.set_pages_to_combobox(pages_number)
i = 1
episodes_url = final_episode_url
self.images = []
while ( i != pages_number + 1):
self.download_image(episodes_url, manga, episode_number, i)
episodes_url = final_episode_url
i = i + 1
episodes_url = episodes_url + "/" + str(i)
self.ui.mangaimage.set_from_file(self.images[0])
scrolledwindow = self.builder.get_object("imagescrolledwindow")
scrolledwindow.set_property("min-content-width", 900)


στην αρχή της θέλω να τρέχω το spinner.start() για να αρχίζει ο spinner και να δείχνει ότι κάτι φορτώνει αλλά δεν γίνεται τίποτα...
το spinner μένει κολλημένο και αρχίζει αφού τελειώσει η συνάρτηση
και εγώ διάβασα κάπου για threads...καμία ιδέα;
δεν έχω πολύ νόημα να κοιτάξετε την συνάρτηση απλά την έβαλα μήπως και ζητήσετε κώδικα :P

να αναφέρω ότι φυσικά και η στοίχιση δεν είναι έτσι! έχει πρόβλημα το copy paste
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό pmav99 » 01 Ιούλ 2012, 18:38

clepto έγραψε:
να αναφέρω ότι φυσικά και η στοίχιση δεν είναι έτσι! έχει πρόβλημα το copy paste
Υπάρχουν και σελίδες για paste, αν και το πρόβλημα σου είναι μάλλον ότι χρησιμοποιείς tabs αντί για spaces (το forum δείχνει τα tabs σαν 8 χαρακτήρες κενού, ενώ ο editor σου πιθανότατα σαν 4). Ρύθμισε τον editor που χρησιμοποιείς να αντικαθιστά τα tabs με spaces και θα είναι οκ.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό clepto » 01 Ιούλ 2012, 21:01

το έκανα pmav

δοκίμασα αντί για spinner μια label αλλά πάλι τίποτα...
δοκίμασα και με time.sleep(2) αλλά πάλι τίποτα
κώδικας:

Μορφοποιημένος Κώδικας: Επιλογή όλων
def my_on_episodetreeview_row_activated(self, widget, path, user_param=None):
waitlabel = self.builder.get_object("waitlabel")
waitlabel.show()
time.sleep(2)
manga = self.get_selected_manga(0)
manga_url = self.get_manga_url(manga)
episode_number = self.get_selected_episode()
first_episode_line = self.find_first_episode_line(manga, manga_url)

episode_line = ""
if manga == "High School of the Dead":
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, True)
elif manga == "Kimi Ni Todoke":
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, True)
else:
episode_line = self.get_episode_line(manga, manga_url, first_episode_line, episode_number, False)

episode_url = self.get_episode_url(manga_url, episode_line)
final_episode_url = "http://www.mangareader.net" + episode_url
pages_number = self.get_pages(final_episode_url)
self.set_pages_to_combobox(pages_number)
i = 1
episodes_url = final_episode_url
self.images = []
while ( i != pages_number + 1):
self.download_image(episodes_url, manga, episode_number, i)
episodes_url = final_episode_url
i = i + 1
episodes_url = episodes_url + "/" + str(i)
self.ui.mangaimage.set_from_file(self.images[0])
scrolledwindow = self.builder.get_object("imagescrolledwindow")
scrolledwindow.set_property("min-content-width", 900)
time.sleep(1)
waitlabel.hide()


πάλι δεν ήταν καλά η στοίχιση ...όχι όσο την προηγούμενη φορά...την έφταξα με το χέρι
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό pmav99 » 01 Ιούλ 2012, 21:22

Για τη στοίχηση εξακολουθείς να χρησιμοποιείς tab. Για τον κώδικα δεν ξέρω τι να σου πω. Αν θες ανέβασε ένα minimum working example. Έτσι τι να δοκιμάσουμε?
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό clepto » 01 Ιούλ 2012, 21:30

αφού το άλλαξα :P
περίμενε να δοκιμάσω να φτιάξω ένα..δεν έχω γράψει καθόλου κώδικα pygtk (χρησιμοποίησα glade) οπότε μπορεί να πάρει λίγη ώρα
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό pmav99 » 01 Ιούλ 2012, 21:33

Εγώ δε λέω ότι δεν το άλλαξες. Εγώ λέω μόνο ότι το snippet που ανέβασες έχει tabs :P
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό clepto » 01 Ιούλ 2012, 21:53

χρησιμοποιώ το παράδειγμα από το 2.2 http://python-gtk-3-tutorial.readthedoc ... le-example
αλλά μου βγάζει
Κώδικας: Επιλογή όλων
(spinner.py:15438): Gtk-CRITICAL **: gtk_container_add: assertion `GTK_IS_CONTAINER (container)' failed
Traceback (most recent call last):
File "/home/chris/Programming/PYTHON/spinner.py", line 22, in <module>
win.connect("delete-event", Gtk.main_quit)
TypeError: object at 0x95eb1bc of type MyWindow is not initialized
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: Glade + python : εμφάνιση spinner

Δημοσίευσηαπό pmav99 » 02 Ιούλ 2012, 00:23

Σε εμένα το παράδειγμα τρέχει χωρίς προβλήματα.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

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

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