Форум сайта python.su
0
В общем есть программка, ее идея в том, чтобы при нажатии на кнопку аргумент 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()
Офлайн
76
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()
Офлайн
186
> Скажите, можно ли как-то обойти это ограничение?
Есть, нужно использовать ООП. Глобальными переменными можно пользоваться только в самом крайнем случае.
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)
Офлайн