На большом изображении вы ищете функцию eval()
.К сожалению, это не безопасная функция .Со встроенной в ваш код строковой формулой все в порядке, но как только вы начнете получать эту строку от пользователя через окно tkinter Entry
, у вас возникнет проблема.Ваш пользователь может набрать что угодно и получить код для его оценки.Например, разрешите им удалить все ваши файлы.
Обеспечение большей безопасности зависит от вас: вы можете сканировать строку, чтобы убедиться, что она содержит только x
и разрешенный набор операторов;вы можете заранее определить все формулы, которые они могут отобразить в dict
;и т. д. Некоторые люди могут утверждать, что ast.literal_eval()
позаботится о безопасности - это не сработает для ваших целей.
На небольшом рисунке вы обнаружили ошибку в вашей функции __init__
fkt
- это переменная , член и имя метода .Это не позволяет вашему коду работать, поэтому я переименовал один из них в мою переработку кода ниже:
import tkinter as tk
class diagram(tk.Frame):
STEP = 100
WIDTH = 600
HEIGHT = 600
BORDER = 15
TICK = 10
def __init__(self, master=None, fkt="2 * x"):
super().__init__(master)
self.fkt_string = fkt
self.cv = tk.Canvas(self, width=self.WIDTH + self.BORDER, height=self.HEIGHT + self.BORDER, bg="#FFAAAA")
self.cv.pack()
self.pack()
self.update_scale()
self.fkt()
def fkt(self):
point_lst = []
for x in range(0, 100):
point_lst.append((x + self.BORDER, self.HEIGHT - eval(self.fkt_string)))
for i in range(1, 100):
self.cv.create_line(point_lst[i - 1][0], point_lst[i - 1][1], point_lst[i][0], point_lst[i][1])
def update_scale(self):
self.cv.delete(tk.ALL)
self.cv.create_line(self.BORDER, self.HEIGHT, self.WIDTH + self.BORDER, self.HEIGHT, width=3)
self.cv.create_line(self.BORDER, self.HEIGHT, self.BORDER, 0, width=3)
# scale on bottom
for x in range(self.BORDER, self.WIDTH + self.BORDER, self.STEP):
self.cv.create_line(x, self.HEIGHT, x, self.HEIGHT - self.TICK)
# scale on side
for y in range(self.HEIGHT, 0, -self.STEP):
self.cv.create_line(self.BORDER, y, self.BORDER + self.TICK, y)
root = tk.Tk()
app = diagram(root)
app.mainloop()
График "2 * x":