Найти - Пользователи
Полная версия: local variable 't' referenced before assignment
Начало » Python для новичков » local variable 't' referenced before assignment
1
Tidusss
В общем есть программка, ее идея в том, чтобы при нажатии на кнопку аргумент t каждый раз возрастал и фигура строилась по другим данным. Однако питон не даёт изменять переменную в функции, если её значение не зафиксировано в этой же функции. Скажите, можно ли как-то обойти это ограничение?
Если нет, как по-другому можно реализовать движение тела по заданным уравнениям? Речь про функцию but.
 from Tkinter import *
from math import *
root=Tk()
root.geometry('760x710')
canv = Canvas(root,width=700,height=700,bg="white")
canv.place(x=0, y=0)
k = 3
r = 3
t = 0
def but(event):
     x = r*(k-1)*(cos(t)+(cos((k-1)*t))/(k-1))
     y = r*(k-1)*(sin(t)-(sin((k-1)*t))/(k-1))
     canv.create_oval(x-5+355,y-5+355,x+5+355,y+5+355,fill="red")
     t += 0.1
button1 = Button(root,text='start',width=3,height=4,bg='gold',fg='black', font=10)
button1.place(x = 720, y = 355)
button1.bind("<Button-1>",but)
root.mainloop()
Romissevd
 from tkinter import *
from math import *
root=Tk()
root.geometry('760x710')
canv = Canvas(root,width=700,height=700,bg="white")
canv.place(x=0, y=0)
k = 3
r = 3
t = 0
def but(event):
     global t
     x = r*(k-1)*(cos(t)+(cos((k-1)*t))/(k-1))
     y = r*(k-1)*(sin(t)-(sin((k-1)*t))/(k-1))
     canv.create_oval(x-5+355,y-5+355,x+5+355,y+5+355,fill="red")
     t += 0.1
button1 = Button(root,text='start',width=3,height=4,bg='gold',fg='black', font=10)
button1.place(x = 720, y = 355)
button1.bind("<Button-1>",but)
root.mainloop()
Rodegast
> Скажите, можно ли как-то обойти это ограничение?

Есть, нужно использовать ООП. Глобальными переменными можно пользоваться только в самом крайнем случае.
 from Tkinter import Tk, Canvas, Button
from math import cos, sin
  
class root(Tk):
	def __init__(self):
		Tk.__init__(self)
		self.geometry('760x710')
		self.canv = Canvas(self, width=700, height=700, bg="white")
		self.canv.place(x=0, y=0)
		self.k = 3
		self.r = 3
		self.t = 0
		self.button1 = Button(self,text='start',width=3,height=4,bg='gold',fg='black', font=10)
		self.button1.place(x = 720, y = 355)
		self.button1.bind("<Button-1>", self.but)
	def but(self, event):
		x = self.r*(self.k-1)*(cos(self.t)+(cos((self.k-1)*self.t))/(self.k-1))
		y = self.r*(self.k-1)*(sin(self.t)-(sin((self.k-1)*self.t))/(self.k-1))
		self.canv.create_oval(x-5+355,y-5+355,x+5+355,y+5+355,fill="red")
		self.t += 0.1
 
root().mainloop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB