我试图做一个副本的metatrader斐波纳契回撤,我股票上调整大小和抓取问题,我可以打开斐波那契与水平和调整大小,但只要我接触的中心,这是抓取,它总是停留在抓取,它不做任何更多的抓取。
import tkinter as tk
class FibonacciRetracementApp:
def __init__(self, master):
self.master = master
self.master.title("Fibonacci Retracement")
self.canvas = tk.Canvas(self.master, width=600, height=400, bg="white")
self.canvas.pack(expand=tk.YES, fill=tk.BOTH)
self.points = []
self.lines = []
self.center_point = None
self.second_set_drawn = False
self.resizing = False
self.resizing_point = None
self.canvas.bind("<Button-1>", self.create_point)
self.canvas.bind("<B1-Motion>", self.on_motion)
self.canvas.bind("<ButtonRelease-1>", self.release_button)
def create_point(self, event):
x, y = event.x, event.y
if self.second_set_drawn:
self.check_for_resizing(x, y)
return
self.points.append((x, y))
if len(self.points) == 2:
if not self.second_set_drawn:
self.draw_fibonacci_retracement()
self.second_set_drawn = True
self.canvas.delete("point")
def check_for_resizing(self, x, y):
if len(self.points) == 2:
if self.center_point is None:
self.add_center_point()
x1, y1 = self.points[0]
x2, y2 = self.points[1]
# Check if the cursor is near the first resize corner
if self.is_near_resize_corner(x, y, x1, y1):
self.resizing = True
self.resizing_point = 0
# Check if the cursor is near the second resize corner
elif self.is_near_resize_corner(x, y, x2, y2):
self.resizing = True
self.resizing_point = 1
def is_near_resize_corner(self, x, y, corner_x, corner_y):
return (corner_x - 5 <= x <= corner_x + 5) and (corner_y - 5 <= y <= corner_y + 5)
def add_center_point(self):
x1, y1 = self.points[0]
x2, y2 = self.points[1]
center_x = (x1 + x2) // 2
center_y = (y1 + y2) // 2
self.center_point = (center_x, center_y)
def move_center_point(self, event):
if self.center_point is not None:
x, y = event.x, event.y
dx = x - self.center_point[0]
dy = y - self.center_point[1]
self.canvas.move("blue_line", dx, dy)
self.center_point = (x, y)
def move_existing_point(self, x, y):
if self.resizing_point is not None:
self.points[self.resizing_point] = (x, y)
self.update_fibonacci_retracement()
def draw_fibonacci_retracement(self):
x1, y1 = self.points[0]
x2, y2 = self.points[1]
retracement_levels = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0]
for level in retracement_levels:
y_level = y1 + level * (y2 - y1)
line = self.canvas.create_line(x1, y_level, x2, y_level, fill="blue", dash=(4, 2), tags="blue_line")
self.lines.append(line)
def update_fibonacci_retracement(self):
if len(self.points) == 2:
x1, y1 = self.points[0]
x2, y2 = self.points[1]
self.canvas.delete("blue_line")
retracement_levels = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0]
for level in retracement_levels:
y_level = y1 + level * (y2 - y1)
line = self.canvas.create_line(x1, y_level, x2, y_level, fill="blue", dash=(4, 2), tags="blue_line")
self.lines.append(line)
def on_motion(self, event):
if self.resizing:
x, y = event.x, event.y
self.move_existing_point(x, y)
elif self.center_point is not None:
self.move_center_point(event)
def release_button(self, event):
self.resizing = False
self.resizing_point = None
if __name__ == "__main__":
root = tk.Tk()
app = FibonacciRetracementApp(root)
root.mainloop()
字符串
我正试着让抓取和逻辑工作没有问题
1条答案
按热度按时间vjrehmav1#
移动后忘记更新
self.points
,移动后忘记更新self.center_point
。字符串