Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    11

    [python] Funzioni e Classi, HELP!!

    Ciao a tutti,

    Premetto che sono agli inizi con python e uso Gnu/Linux. Dunque:
    Ho scritto un programma in python usando i moduli gtk, e visto che il file principale 'gtk_button.py' (in C detto main) è diventato troppo lungo (si fa per dire) ho deciso di mettere qualche funzione in un secondo file 'lib.py'. La funzione consente di creare una finestra e di visualizzarla. Tale funzione sarà poi richiamata dal file principale 'gtk_button.py'.

    Vi posto il codice del file 'gtk_button.py' (la chiamata alla funzione si chiama 'lib_Main.make_secondwindow()' :

    codice:
    #test su gtk e principali widget
    
    import pygtk
    pygtk.require('2.0')
    import gtk
    from lib import *
    
    
    i = 0 #indice di avanzamento pulsante
    
    class Main:
    
    
    	def delete_event(self, widget, event, data=None):
    		print "destroy event occurred"
    		gtk.main_quit()
    
    	
    	def button1_clicked(self, widget, data):
    		global i #definisco i una variabile globale
    		i = i + 1
    		if i > 9:
    			i = 0
    		print "button1 clicked - data = %d" % i
    		#self.label1.set_text("%d" % i)
    		#self.label1.set_markup('%d' % i)
    		self.label1.set_markup('<span foreground="blue" background="yellow">%d</span>' % i)
    		if i == 9:
    			#Creo la finestra secondaria
    			lib_Main.make_secondwindow()
    			
    
    	def __init__(self):
    
    	#Creo la finestra principale
    		self.mainwindow = gtk.Window(gtk.WINDOW_TOPLEVEL)
    		self.mainwindow.connect("delete_event", self.delete_event)
    		self.mainwindow.set_title("main window")
    		self.mainwindow.set_position(gtk.WIN_POS_CENTER_ALWAYS)
    		self.mainwindow.set_border_width(10)
    		self.mainwindow.resize(250,250)
    		
    	#Creo la hbox1
    		self.hbox1 = gtk.HBox(True,2)
    		self.mainwindow.add(self.hbox1)
    		self.hbox1.show()
    
    	#Creo il button1
    		self.button1 = gtk.Button("Press")
    		self.button1.connect("clicked", self.button1_clicked, None)
    		self.hbox1.pack_start(self.button1, True, True, 0)
    		self.button1.show()
    
    	#Creo la label1
    		self.label1 = gtk.Label("Press the button on left")
    		self.hbox1.pack_start(self.label1, True, True, 0)
    		self.label1.show()
    
    		self.mainwindow.show()
    
    
    	def main(self):
    		gtk.main()
    
    print __name__
    if __name__ == "__main__":
    	base = Main()
    	base.main()
    Vi posto il codice del file 'lib.py':

    codice:
    import pygtk
    pygtk.require('2.0')
    import gtk
    
    class lib_Main():
    
    	def make_secondwindow():
    		self.secondwindow = gtk.Window(gtk.WINDOW_TOPLEVEL)	
    		self.secondwindow.set_title("second window")
    		self.secondwindow.set_position(gtk.WIN_POS_CENTER_ALWAYS)
    		self.secondwindow.set_border_width(10)
    						
    		self.label2 = gtk.Label("Application made by domenan, in 02/05/2009")
    		self.secondwindow.add(self.label2)
    		self.label2.show()
    		
    		self.secondwindow.show()
    Questo è l'errore che ricevo, quando viene avviata la funzione 'lib_Main.make_secondwindow()' :

    codice:
    Traceback (most recent call last):
      File "gtk_button.py", line 30, in button1_clicked
        lib_Main.make_secondwindow()
    TypeError: unbound method make_secondwindow() must be called with lib_Main instance as first argument (got nothing instead)
    sapreste aiutarmi?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    non conosco il python ma dall'errore sembra che quella funzione appartanga ad una classe lib_main e che serva quindi un oggetto lib_main per usarla..

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    11
    Originariamente inviato da Stoicenko
    non conosco il python ma dall'errore sembra che quella funzione appartanga ad una classe lib_main e che serva quindi un oggetto lib_main per usarla..
    in fatti quando la chiamo scrivo 'lib_main.make_secondwindow()'.
    Quando torno a casa dal lavoro proverò con 'self.lib_main.make_secondwindow()', cosa ne pensi?

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    scusa ma sono poco pratico..

    ma lib_Main è il nome della classe no? non dovresti avere un oggetto istanziato (come variabile) per usare i suoi metodi? o in python è tutto statico?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    11
    Originariamente inviato da domenan
    in fatti quando la chiamo scrivo 'lib_main.make_secondwindow()'.
    Quando torno a casa dal lavoro proverò con 'self.lib_main.make_secondwindow()', cosa ne pensi?
    Per questo non so risponderti. Ma comunque per ora ho risolto con questo codice:

    codice:
    def make_secondwindow():
    	secondwindow = gtk.Window(gtk.WINDOW_TOPLEVEL)	
    	secondwindow.set_title("second window")
    	secondwindow.set_position(gtk.WIN_POS_CENTER_ALWAYS)
    	secondwindow.set_border_width(10)
    						
    	label2 = gtk.Label("Application made by domenan, in 02/05/2009")
    	secondwindow.add(label2)
    	label2.show()
    		
    	secondwindow.show()
    In questo modo funziona bene.

    Poi in serata mi studierò bene le classi in python per capire dove sbagliavo.

  6. #6
    Dichiaravi la funzione "make_secondwindow" senza "self":

    def make_secondwindow():

    ...il modo corretto è:

    def make_secondwindow(self):
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.