Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2018 21:40:25

Tidusss
Зарегистрирован: 2018-04-17
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

local variable 't' referenced before assignment

В общем есть программка, ее идея в том, чтобы при нажатии на кнопку аргумент 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()

Офлайн

#2 Апрель 24, 2018 22:51:53

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

local variable 't' referenced before assignment

 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()

Офлайн

#3 Апрель 25, 2018 11:52:33

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

local variable 't' referenced before assignment

> Скажите, можно ли как-то обойти это ограничение?

Есть, нужно использовать ООП. Глобальными переменными можно пользоваться только в самом крайнем случае.

 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()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 25, 2018 12:13:34)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version