Forum
>>
Programmazione Python
>>
GUI
>>
[RISOLTO] non riesco a gestire... canvas.delete('all')
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
|
Scritto da Orso2001 |
2017-01-16 22:18:26 - [RISOLTO] non riesco a gestire... canvas.delete('all')
|
|
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 --- |
|
|
Scritto da Orso2001 |
2017-01-17 23:34:38 - Re: non riesco a gestire... canvas.delete('all')
|
|
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.
