Forum >> Programmazione Python >> GUI >> [RISOLTO] non riesco a gestire... canvas.delete('all')

Pagina: 1

Buongiorno a Tutti,

sto, passatemi il termine, giocando un po' con python e tkinter; attualmente vorrei realizzare un effetto in cui una serie di cerchi distribuiti in una circonferenza ruotino a "tempo"...in tal senso ho scritto il seguente codice:
from tkinter import *
import math


WID, HEI = 400, 400         # dimensioni finestra
XC, YC = WID//2,  HEI//2    # centro finestra
RADIUS = WID / 2 * 0.75     # raggio effetto grafico
POINTS = 24                 # numero cerchi
RP = 10                     # raggio dei punti
deg =  270                  # angolo di partenza


finestra = Tk()
x = (finestra.winfo_screenwidth() /2)  -  (WID / 2)  # centra la finestra in x
y = (finestra.winfo_screenheight() /2)  -  (HEI / 2) # centra la finestra in y
finestra.geometry("%dx%d+%d+%d" % (WID, HEI, x, y))
finestra.title('Finestra con cerchi')


class App():
    
    def __init__(self,root,gradi):
        self.root = root
        self.tela=Canvas(self.root,width='%d'%(WID),height='%d'%(HEI),bg='yellow')
        self.tela.create_line(XC,YC,XC,(HEI-(YC*1.6)))
        self.tela.create_line((XC-20),(YC/1.6),XC,(HEI-(YC*1.6)))
        self.tela.create_line((XC+20),(YC/1.6),XC,(HEI-(YC*1.6)))
        self.gradi=gradi

    def draw(self):
        rad = math.radians(self.gradi)
        x = XC + RADIUS * math.cos(rad)
        y = YC + RADIUS * math.sin(rad)
        self.tela.create_oval(x-RP, y-RP, x+RP, y+RP, fill='green')
        self.tela.pack()
        self.gradi = self.gradi + (360/POINTS)
       
        
    def loop(self):
        
        for i in range (0,POINTS):
            self.draw()
            t=i
        if t == (POINTS-1):
            self.tela.delete('all')
            self.gradi=self.gradi+1
            t=0
            self.tela.after(100,self.start)
              
            
    def start(self):
        self.loop()
        finestra.mainloop()

app=App(finestra,deg)
app.start()

Ad essere più precisi questo è uno dei tanti tentativi che ho creato per gestire il tutto.
In pratica non riesco a gestire il "refresh" della canvas...sto provando con delete (self.tela.delete('all'))...ma compare la canvas vuota...se ometto quella riga i cerchi ruotano ma si sovrappongono creando un flusso continuo...ho provato ad inizializzare inserendo subito dopo il "self.__init__(self.root,self.gradi)"...ma niente.
Cortesemente potete chiarirmi dove sbaglio ed il modo per eseguire il "refresh" (totale e parziale) della canvas?
grazie


--- Ultima modifica di Orso2001 in data 2017-01-17 23:35:08 ---
come previsto stavo sbagliando tutto...ecco la soluzione:
from tkinter import *
import math

WID, HEI = 400, 400         # dimensioni finestra
XC, YC = WID//2,  HEI//2    # centro finestra
RADIUS = WID / 2 * 0.75     # raggio effetto grafico
POINTS = 24                 # numero cerchi
RP = 10                     # raggio dei punti
deg =  270                  # angolo di partenza


finestra = Tk()
x = (finestra.winfo_screenwidth() /2)  -  (WID / 2)  # centra la finestra in x
y = (finestra.winfo_screenheight() /2)  -  (HEI / 2) # centra la finestra in y
finestra.geometry("%dx%d+%d+%d" % (WID, HEI, x, y))
finestra.title('Finestra con cerchi')


class App():
    
    def __init__(self,root,gradi):
        self.root = root
        self.tela=Canvas(self.root,width='%d'%(WID),height='%d'%(HEI),bg='yellow')
        self.tela.create_line(XC,YC,XC,(HEI-(YC*1.6)))
        self.tela.create_line((XC-20),(YC/1.6),XC,(HEI-(YC*1.6)))
        self.tela.create_line((XC+20),(YC/1.6),XC,(HEI-(YC*1.6)))
        self.tela.pack()
        self.gradi=gradi
        self.lista=[]
        for i in range(0,POINTS):
            
            rad = math.radians(self.gradi)
            x = XC + RADIUS * math.cos(rad)
            y = YC + RADIUS * math.sin(rad)
            self.w=self.tela.create_oval(x-RP, y-RP, x+RP, y+RP, fill='green')
            self.lista.append(self.w)
            self.gradi = self.gradi + (360/POINTS)
            
                  
    def draw(self):
        self.gradi+=2
        self.tela.after(50,self.draw)
        for self.w in self.lista:
            
            rad = math.radians(self.gradi)
            x = XC + RADIUS * math.cos(rad)
            y = YC + RADIUS * math.sin(rad)
            self.tela.coords(self.w,x-RP, y-RP, x+RP, y+RP)
            self.gradi = self.gradi + (360/POINTS)
        
          
    def start(self):
        self.draw()
        finestra.mainloop()

app=App(finestra,deg)
app.start()



Pagina: 1



Esegui il login per scrivere una risposta.