Topic: [Risolto] Errore sconosciuto anche su google ......  (Letto 874 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Alkatron

[Risolto] Errore sconosciuto anche su google ......
« il: Giugno 24, 2010, 14:33 »
Warning: g_main_loop_run(): called recursively from within a source's check() or prepare() member, iteration not possible.
  gtk.main()

Cercandolo su google mi da 7 risultati nessuno utile che spiega che errore è

Praticamente apro un gtk.main() principale
Per le varie voci del menu apro un nuovo gtk.main()

e tutto funziona regolarmente

se si verifica un cambio di risoluzione del video nell'evento screen size-changed chiamo una finestra di dialogo (message box) aprendo un nuovo gtk.main()
Ecco a questo punto mi da quel warning....

Lo stesso message box lo uso normalmente in altri parti del programa con la stessa tecnica e non da problemi

Non chiedo di risolvermi il problema...ma qualcuno sa spiegarmi o indirizzarmi verso una spiegazione di cosa si tratta quel warning....

Ciao e grazie
« Ultima modifica: Giugno 25, 2010, 14:46 da Alkatron »

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
Re: Errore sconosciuto anche su google ......
« Risposta #1 il: Giugno 24, 2010, 18:11 »
gtk.main() credo dovrebbe essere chiamato una volta sola per la main window.

Alkatron

Re: Errore sconosciuto anche su google ......
« Risposta #2 il: Giugno 24, 2010, 18:22 »
Fondamentalmente mi sono basato sugli esempi trovati in rete.

Dopo il tuo consiglio ho provato a levarlo ma succede che quando esegue il seguente codice per es

input_cfg()
self.creabtn()


dove


class ConfDialog( gtk.Dialog):
    def __init__( self, ffont, modal= True):
        gtk.Dialog.__init__(self, ffont)
        self.connect("destroy", self.quit)
        self.connect("delete_event", self.quit)
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)

        self.set_default_response(gtk.RESPONSE_APPLY)
       
        if modal:
            self.set_modal(True)
        _tbl = gtk.Table(1, 1, False)   
        self.chkupp = gtk.CheckButton(uu(_('Upper')))
        self.chkupp.set_active(True)
        self.chkupp.child.modify_font(pango.FontDescription(ffont))
        _tbl.attach(self.chkupp, 0, 1, 0, 1, gtk.EXPAND)
        _tbl.show()   
        self.chkupp.show()
        self.vbox.pack_start(_tbl)

        button = gtk.Button("OK")
        button.connect("clicked", self.click)
        button.set_flags(gtk.CAN_DEFAULT)
        button.set_flags(gtk.HAS_DEFAULT)
        button.set_flags(not gtk.RECEIVES_DEFAULT)
        self.action_area.pack_start(button)
        button.show()
        button.grab_default()
        button = gtk.Button("Cancel")
        button.connect("clicked", self.quit)
        self.action_area.pack_start(button)
        button.show()
        self.ret = None
    def quit(self, w=None, event=None):
        self.hide()
        self.destroy()
        #gtk.main_quit()
    def click(self, button):
        if self.chkupp.get_active():
           _rret = 'upp'
        else:
           _rret = 'nrm'
        CNFBBY.var.upper=_rret
        self.ret = [_rret]
        self.quit()

def input_cfg( modal= True):
    '''
    Dialog di input
    '''
    win = ConfDialog(CNFBBY.fnt.mdm, modal=modal)
    win.set_title(uu(_('General configuration')))
    win.show()
    #gtk.main()
    return win.ret

esegue creabtn senza aspettare che esca dal dialog, quindi la configurazione impostata dall'utente nel dialog non viene modificata in quanto la routine di modifica (creabtn) è gia stata eseguita.
Prova ne è il fatto che se rilancio la configurazione a quel punto viene cambiata, in quanto esegue subito di nuovo creabtn.

Ciao e grazie

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
Re: Errore sconosciuto anche su google ......
« Risposta #3 il: Giugno 24, 2010, 18:40 »
non so se ho capito bene.. nel momento che viene caricata la finestra dialog viene eseguita pure la funzione click(self,button) prima di aver cliccato sul pulsante?

ho modificato un pò il tuo codice per farlo funzionare (come credo dovrebbe) sul mio pc:
[hlpycode]
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
class ConfDialog( gtk.Dialog):
    def __init__( self, ffont, modal= True):
        gtk.Dialog.__init__(self, ffont)
        self.connect("destroy", self.quit)
        self.connect("delete_event", self.quit)
        self.set_position(gtk.WIN_POS_CENTER_ALWAYS)

        self.set_default_response(gtk.RESPONSE_APPLY)
       
        if modal:
            self.set_modal(True)
        _tbl = gtk.Table(1, 1, False)   
        self.chkupp = gtk.CheckButton('Upper')
        self.chkupp.set_active(True)
        self.chkupp.child.modify_font(pango.FontDescription(ffont))
        _tbl.attach(self.chkupp, 0, 1, 0, 1, gtk.EXPAND)
        _tbl.show()   
        self.chkupp.show()
        self.vbox.pack_start(_tbl)

        button = gtk.Button("OK")
        button.connect("clicked", self.click)
        button.set_flags(gtk.CAN_DEFAULT)
        button.set_flags(gtk.HAS_DEFAULT)
        button.set_flags(not gtk.RECEIVES_DEFAULT)
        self.action_area.pack_start(button)
        button.show()
        button.grab_default()
        button = gtk.Button("Cancel")
        button.connect("clicked", self.quit)
        self.action_area.pack_start(button)
        button.show()
        self.ret = None
    def quit(self, w=None, event=None):
        gtk.main_quit()
    def click(self, button):
        if self.chkupp.get_active():
           print "up"
        else:
           print "nrm"
        gtk.main_quit()
           

def input_cfg( modal= True):
    '''
    Dialog di input
    '''
    win = ConfDialog(None, modal=modal)
    win.set_title('General configuration')
    win.show()

input_cfg()
gtk.main()
[/hlpycode]
« Ultima modifica: Giugno 24, 2010, 18:46 da pycasso »

Alkatron

Re: Errore sconosciuto anche su google ......
« Risposta #4 il: Giugno 24, 2010, 19:24 »
Quella era la risposta al tuo consiglio di usare un solo main loop.
Ho fatto un esempio funzionante in cui vedi il perche devo usarne + d 1


import gtk 
class ConfDialog( gtk.Dialog): 
      def __init__( self, ffont, modal= True): 
          gtk.Dialog.__init__(self, ffont) 
          self.connect("destroy", self.quit) 
          self.connect("delete_event", self.quit) 
          self.set_position(gtk.WIN_POS_CENTER_ALWAYS) 
   
          self.set_default_response(gtk.RESPONSE_APPLY) 
           
          if modal: 
              self.set_modal(True) 
          _tbl = gtk.Table(1, 1, False)     
          self.chkupp = gtk.CheckButton('Upper') 
          self.chkupp.set_active(True) 
#          self.chkupp.child.modify_font(pango.FontDescription(ffont)) 
          _tbl.attach(self.chkupp, 0, 1, 0, 1, gtk.EXPAND) 
          _tbl.show()     
          self.chkupp.show() 
          self.vbox.pack_start(_tbl) 
   
          button = gtk.Button("OK") 
          button.connect("clicked", self.click) 
          button.set_flags(gtk.CAN_DEFAULT) 
          button.set_flags(gtk.HAS_DEFAULT) 
          button.set_flags(not gtk.RECEIVES_DEFAULT) 
          self.action_area.pack_start(button) 
          button.show() 
          button.grab_default() 
          button = gtk.Button("Cancel") 
          button.connect("clicked", self.quit) 
          self.action_area.pack_start(button) 
          button.show() 
          self.ret = None 
      def quit(self, w=None, event=None): 
          self.hide()
          self.destroy()
          #alk
          #gtk.main_quit()
      def click(self, button): 
          if self.chkupp.get_active(): 
             print "up" 
          else: 
             print "nrm" 
          self.quit() 
             
class ViewExample:
    # close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        print 'quit'
        return False
    def __init__(self):
        # Create a new window
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("Basic TreeView Example")
        self.window.set_size_request(200, 200)
        self.window.connect("delete_event", self.delete_event)
        # create a TreeStore with one string column to use as the model
        button = gtk.Button("conf")
        button.connect("clicked", self.on_clicked)
        self.window.add(button)
        self.window.show_all()
    def on_clicked(self,widget):
        input_cfg()
        print 'pippo' 

   
def input_cfg( modal= True): 
    '''''
    Dialog di input
    ''' 
    win = ConfDialog(None, modal=modal) 
    win.set_title('General configuration') 
    win.show() 
    #alk
    #gtk.main()
    return win.ret
   
def main():
    gtk.main()
if __name__ == "__main__":
    vexample = ViewExample()
    main()

Se provi ad eseguirlo cosi com'è vedrai che ti scrive pippo appena clicchi sul bottone, se invece "nesti" un main loop, levando le rem alle righe sotto i 2 #alk vedrai che pippo lo scrive quando esci dal dialog.

Il mio problema cmq è che funziona tutto bene tranne quando chiamo la dialog da un evento screen size-changed e mi da quel warning e non riesco a trovare informazioni su quel messaggio

Ciao e grazie

Offline pycasso

  • python erectus
  • ***
  • Post: 107
  • Punti reputazione: 0
    • Mostra profilo
    • viva la polpetta
Re: Errore sconosciuto anche su google ......
« Risposta #5 il: Giugno 24, 2010, 21:46 »
il messaggio di warning credo dipenda dall'uso multiplo del gtk.main()
nel tuo esempio il print "pippo" viene ovviamente eseguito appena dopo l'esecuzione della funzione input_cfg()
mentre se a questa funzione aggiungi il loop, questo tiene "occupato" input_cfg() e la funzione click() non può stampare "pippo"
 fin quando non verrà invocato il gtk.main_quit()

tutto questo credo sia risolvibile in altro modo..
il print "pippo" puoi ad esempio connetterlo al segnale "destroy" della window..

Offline moaiamorfo

  • python sapiens
  • ***
  • amministratore
  • Post: 782
  • Punti reputazione: 2
  • premitore di tasti e muovitore di mouse
    • Mostra profilo
    • Antonio Fittipaldi - docente MIUR e analista programmatore - Policoro (Matera)
Re: Errore sconosciuto anche su google ......
« Risposta #6 il: Giugno 24, 2010, 21:59 »
@Alkatron: usa il pulsantino con l'effige di Python per inserire codice pitonico, grazie. :)

saluti

Alkatron

Re: Errore sconosciuto anche su google ......
« Risposta #7 il: Giugno 25, 2010, 14:45 »
@Alkatron: usa il pulsantino con l'effige di Python per inserire codice pitonico, grazie. :)
Chiedo scusa....

tutto questo credo sia risolvibile in altro modo..
Esatto....... basta chiamare la dialog con run invece che con show e non serve + il loop per tenerla bloccata

Grazie cmq

Ciao

Offline Bakuriu

  • python sapiens sapiens
  • ******
  • Post: 2.267
  • Punti reputazione: 2
  • Katon, Goukakyuu no jutsu!
    • Mostra profilo
    • Jack's Blackboard - Il mio blog
Re: Errore sconosciuto anche su google ......
« Risposta #8 il: Giugno 25, 2010, 15:09 »
@Alkatron: usa il pulsantino con l'effige di Python per inserire codice pitonico, grazie. :)
Chiedo scusa....

tutto questo credo sia risolvibile in altro modo..
Esatto....... basta chiamare la dialog con run invece che con show e non serve + il loop per tenerla bloccata

Grazie cmq

Ciao

Il tuo è il classico caso in cui ti serve una finestra modale...
Usa show solo quando vuoi che l'utente possa interagire con il resto dell'applicazione, altrimenti vai di dialog modale(questo vale per qualsiasi libreria grafica).