Forum >> Programmazione Python >> GUI >> Tkinter Text self.testo.insert()

Pagina: 1

Buongiorno a tutti,
come ve la passate? Qua sto uscendo scemo per un errore che non riesco proprio a capire, s magari qualcuno di voi riuscisse a darmi una mano gli sarei molto grato.
Partendo da principio, sto seguendo un tutorial: http://www.arcetri.astro.it/~lfini/AGauld/ e sono arrivato all'esempio finale.

Prima di vedere per bene come fa lui, mi piacerebbe provare a fare un programma da solo per vedere effettivamente quello che sono riuscito ad assimilare.

Il programma è un contatore di parole e "controllo" grammaticale (conta capoversi, frasi, punteggiatura ecc...) ed ècomposto da una finestra principale con all'interno tre sezioni principali:
1- un header nel quale ci sono un Entry, un bottone ed una combobox
2- il body che contiene un elemento Text che andrò poi a riempire
3- un footer con i pulsanti per cancellare il contenuto della Entry e per chiudere la finestra.
Lo scopo di questa pagina per ora, è semplicemente quello di aprire un file immettendo il nome nella Entry e riportarlo nel Text subito sotto. Successivamente ho pensato di proseguire mettendo di fianco al Text una selezione di qualche tipo per far scegliere all'utente cosa far contare al programma e mettere quindi poi un bottone che avvii il conto.
Tutta questa seconda parte la vedrò poi man mano che riesco a mettere a posto tutti i problemi che si verificheranno.

Il mio codice per ora è il seguente:
#!/usr/bin/env python
############################
# Autore : Luca Ciardiello #
# Data   : 07/04/2015      #
############################
from Tkinter import *

##################################
# Classe finestra di interazione #
##################################
class ApplicazioneGrammatica():

  ################################
  # funzione per evento cancella #
  ################################
  def evCanc(self):
    self.testoRicerca.delete(0,END)

  #####################################################
  # funzione per caricamento testo in frameBody Testo #
  #####################################################
  def loadFile(fileName):
    i=1
    filein=open("menu.txt","r")
    for riga in filein.readlines():
      i+=1
      self.testo.insert(i,riga)
    filein.close()

  ###############
  # costruttore #
  ###############
  def __init__(self,padre=0):
    # Frame principale #
    self.finestraPrincipale=Frame(padre)
    # Frame header #
    self.finestraHeader=Frame(self.finestraPrincipale)
    # Entry per ricerca del file #
    self.finestraRicerca=Frame(self.finestraHeader)
    self.etichettaRicerca=Label(self.finestraHeader,text="File Path: ")
    self.testoRicerca=Entry(self.finestraHeader)
    #self.bottoneRicerca=Button(self.finestraHeader,text="Carica",command=self.loadFile(self.testoRicerca.get()))
    self.bottoneRicerca=Button(self.finestraHeader,text="Carica",command=self.loadFile)
    # RadioButton per selezione ricerca #
    self.BottoniRicerca=Frame(self.finestraHeader,border=1)
    self.radioTesto=Radiobutton(self.BottoniRicerca,text=".txt   ", value="1")
    self.radioHtml=Radiobutton(self.BottoniRicerca,text=".html", value="2")
    # Frame body #
    self.finestraBody=Frame(self.finestraPrincipale)
    self.testo=Text(self.finestraBody,height=20,width=60)
    # Frame footer #
    self.finestraFooter=Frame(self.finestraPrincipale)
    self.finestraBottoni=Frame(self.finestraFooter)
    self.bCancella=Button(self.finestraBottoni,text="Cancella",command=self.evCanc)
    self.bEsci=Button(self.finestraBottoni,text="Esci",command=self.finestraPrincipale.quit)
    # visualizzazione degli elementi #
    self.finestraPrincipale.pack()
    self.finestraHeader.pack()
    self.finestraRicerca.pack(side="left")
    self.etichettaRicerca.pack(side="left")
    self.testoRicerca.pack(side="left")
    self.bottoneRicerca.pack(side="left")
    self.BottoniRicerca.pack(side="left")
    self.radioTesto.pack(padx=20)
    self.radioHtml.pack(padx=20)
    self.finestraBody.pack()
    self.testo.pack()
    self.finestraFooter.pack()
    self.finestraBottoni.pack()
    self.bCancella.pack(side="left")
    self.bEsci.pack(side="left")

######################
# avvio ciclo eventi #
######################
app=ApplicazioneGrammatica()
app.finestraPrincipale.mainloop()

All'avvio del programma va tutto bene. Si apre la finestra e quasi tutti i pulsanti si comportano in maniera corretta. Il problema sta el pulsante carica. Quando lo clicco, sul terminale compare l'errore
o# ./interfaccia.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
return self.func(*args)
File "./interfaccia.py", line 27, in loadFile
self.testo.insert(i,riga)
NameError: global name 'self' is not defined

il mio dubbio è: self non va messo per comunicare all'oggetto che deve utilizzare uno suo stesso componente? Visto che sono agli inizi ho provato ad andare per esclusione ed omettere self, quindi la string è testo.insert(i,riga) ma giustamente l'interprete mi dice che non esiste nessuna variabile globale testo.
Cosa sto dimenticando.
In attesa di una risposta mi riguarderò un poco cosa dice il tutorial sulle variabili anche se mi sembrava di aver capito giustamente che le variabili globali sono dichiarate fuori dalle funzioni e dalle classi e nel caso ci sia l'utlizzo di una variabile globale lo dovrei specificare in modo che non ci sia la creazione in locale (nella funzione/classe) di una variabile chiamata come quella globale che però va a nasconderla.
Grazie di eventuali aiuti
Bongo
Sono andato un po' avanti. Adesso il problema sembrerebbe risolto ma incontro un nuovo problema. Quando cerco di aprire un file che so di certo esserci mi compare l'errore:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1437, in __call__
return self.func(*args)
File "./interfaccia2.py", line 31, in loadFile
filein=open(str(fileName),"r")
IOError: [Errno 2] No such file or directory: '<__main__.ApplicazioneGrammatica instance at 0x7fcd77e0ae60>'

il codice ha pochi cambiamenti comunque adesso è questo
#!/usr/bin/env python 
#############################################################################################################
# Autore      | Luca Ciardiello                                                                             #
#-------------+---------------------------------------------------------------------------------------------#
# Data        | 07/04/2015                                                                                  #
#-------------+---------------------------------------------------------------------------------------------#
# Versione    | 0.1                                                                                         #
#-------------+---------------------------------------------------------------------------------------------#
# Descrizione | l'applicazione grammatica imita il comando wc contando parole, righe e caratteri di un file #
#             | e permettendo di contare i simboli di punteggiatura, i capoversi e le frasi (assumendo che  #
#             | le frasi siano terminate sempre con un carattere [. , ? , !]                                #
#############################################################################################################
from Tkinter import *

##################################
# Classe finestra di interazione #
##################################
class ApplicazioneGrammatica():

  ################################
  # funzione per evento cancella #
  ################################
  def evCanc(self):
    self.testoRicerca.delete(0,END)

  #####################################################
  # funzione per caricamento testo in frameBody Testo #
  #####################################################
  def loadFile(fileName):
    i=1
    filein=open("menu.txt","r")
    for riga in filein.readlines():
      i+=1
      self.testo.insert(i,riga)
    filein.close()

  ###############
  # costruttore #
  ###############
  def __init__(self,padre=0):
    # Frame principale #
    self.finestraPrincipale=Frame(padre)
    # Frame header #
    self.finestraHeader=Frame(self.finestraPrincipale)
    # Entry per ricerca del file e pulsante ricerca #
    self.finestraRicerca=Frame(self.finestraHeader)
    self.etichettaRicerca=Label(self.finestraHeader,text="File Path: ")
    self.testoRicerca=Entry(self.finestraHeadera)
    # RadioButton per selezione del tipo di testo #
    self.bottoneRicerca=Button(self.finestraHeader,text="Carica",command=self.loadFile)
    self.BottoniRicerca=Frame(self.finestraHeader,border=1)
    self.radioTesto=Radiobutton(self.BottoniRicerca,text=".txt   ", value="1")
    self.radioHtml=Radiobutton(self.BottoniRicerca,text=".html", value="2")
    # Frame body #
    self.finestraBody=Frame(self.finestraPrincipale)
    self.testo=Text(self.finestraBody,height=20,width=60)
    # Frame footer #
    self.finestraFooter=Frame(self.finestraPrincipale)
    self.finestraBottoni=Frame(self.finestraFooter)
    self.bCancella=Button(self.finestraBottoni,text="Cancella",command=self.evCanc)
    self.bEsci=Button(self.finestraBottoni,text="Esci",command=self.finestraPrincipale.quit)
    # visualizzazione degli elementi #
    self.finestraPrincipale.pack()
    self.finestraHeader.pack()
    self.finestraRicerca.pack(side="left")
    self.etichettaRicerca.pack(side="left")
    self.testoRicerca.pack(side="left")
    self.bottoneRicerca.pack(side="left")
    self.BottoniRicerca.pack(side="left")
    self.radioTesto.pack(padx=20)
    self.radioHtml.pack(padx=20)
    self.finestraBody.pack()
    self.testo.pack()
    self.finestraFooter.pack()
    self.finestraBottoni.pack()
    self.bCancella.pack(side="left")
    self.bEsci.pack(side="left")

######################
# avvio ciclo eventi #
######################
app=ApplicazioneGrammatica()
app.finestraPrincipale.mainloop()

filein=open(str(fileName),"r")
IOError: [Errno 2] No such file or directory: '<__main__.ApplicazioneGrammatica instance at 0x7fcd77e0ae60>'
Ciao Bongo, non mi sembra ci siano molti dubbi, l'errore mi sembra abbastanza auto-esplicativo.
--- Ultima modifica di Bongo in data 2015-04-09 08:44:39 ---
Grazie, avevo proprio bisogno di qualcuno che mi dicesse di aver capito il problema che io non ho capito. Non so come ringraziarti


--- Ultima modifica di Bongo in data 2015-04-09 08:45:56 ---

--- Ultima modifica di Bongo in data 2015-04-09 08:46:10 ---


Pagina: 1



Esegui il login per scrivere una risposta.