summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2021-04-05 19:19:14 +0400
committerAndrew Guschin <saintruler@gmail.com>2021-04-05 19:19:14 +0400
commit399b82de92f508b8d96ea0c55d240ee09e0310b3 (patch)
tree559cdf4697f0f4ada7d3a7e91a4ff243f18d0b13
parent02bd09ba0d738fab3c502473489d74c0ea32bc49 (diff)
Добавил обработку ошибок
-rw-r--r--python-graphics/main.py79
-rw-r--r--python-graphics/test.py55
2 files changed, 56 insertions, 78 deletions
diff --git a/python-graphics/main.py b/python-graphics/main.py
index db22eeb..99ec770 100644
--- a/python-graphics/main.py
+++ b/python-graphics/main.py
@@ -68,14 +68,14 @@ class PresetPlotFrame(tk.Frame):
self.l_min.grid(row=1, column=0)
self.min = tk.Entry(self)
- self.min.grid(row=1, column=1)
+ self.min.grid(row=1, column=1, sticky=tk.W + tk.E)
self.l_max = tk.Label(self)
self.l_max["text"] = "max(x)"
self.l_max.grid(row=2, column=0)
self.max = tk.Entry(self)
- self.max.grid(row=2, column=1)
+ self.max.grid(row=2, column=1, sticky=tk.W + tk.E)
la = tk.Label(self)
la["text"] = "a: "
@@ -117,7 +117,7 @@ class PresetPlotFrame(tk.Frame):
for i, (label, var) in enumerate(self.variables[new_type], 3):
label.grid(row=i, column=0)
- var.grid(row=i, column=1)
+ var.grid(row=i, column=1, sticky=tk.W + tk.E)
def grid_size(self):
return (4, 2)
@@ -128,29 +128,49 @@ class PresetPlotFrame(tk.Frame):
self.grid_columnconfigure(1, weight=4)
def collect_info(self):
- # TODO: Добавить валидацию данных в этих полях.
cur_type = self.preset_type.get()
v = self.variables[cur_type]
+ try:
+ min_x = float(self.min.get())
+ except ValueError:
+ return {"status": "error", "message": "min(x) не является float"}
+ try:
+ max_x = float(self.max.get())
+ except ValueError:
+ return {"status": "error", "message": "max(x) не является float"}
+ try:
+ a = float(v[0][1].get())
+ except ValueError:
+ return {"status": "error", "message": "a не является float"}
+ try:
+ b = float(v[1][1].get())
+ except ValueError:
+ return {"status": "error", "message": "b не является float"}
+
if cur_type == PresetType.PARABOLA:
+ try:
+ c = float(v[2][1].get())
+ except ValueError:
+ return {"status": "error", "message": "c не является float"}
return {
"status": "ok",
"graph": "preset",
"type": "parabola",
- "min": self.min.get(),
- "max": self.max.get(),
- "a": v[0][1].get(),
- "b": v[1][1].get(),
- "c": v[2][1].get()
+ "min": min_x,
+ "max": max_x,
+ "a": a,
+ "b": b,
+ "c": c
}
elif cur_type == PresetType.LINE:
return {
"status": "ok",
"graph": "preset",
"type": "line",
- "min": self.min.get(),
- "max": self.max.get(),
- "a": v[0][1].get(),
- "b": v[1][1].get()
+ "min": min_x,
+ "max": max_x,
+ "a": a,
+ "b": b
}
@@ -202,15 +222,19 @@ class PointPlotFrame(tk.Frame):
grid_conf(self, gr, gc)
def collect_info(self):
- # TODO: Добавить обработку ошибок (нет файла, нельзя прочитать,
- # неправильный формат данных и т.д)
- with open(self._path) as f:
- data = f.read().strip().split()
-
- points = []
- for line in data:
- x, y = map(int, line.split(','))
- points.append((x, y))
+ try:
+ with open(self._path) as f:
+ data = f.read().strip().split()
+ except FileNotFoundError:
+ return {"status": "error", "message": "Файл не найден"}
+
+ try:
+ points = []
+ for line in data:
+ x, y = map(float, line.split(','))
+ points.append((x, y))
+ except ValueError:
+ return {"status": "error", "message": "Неверный формат данных"}
return {"status": "ok", "graph": "point", "points": points}
@@ -269,6 +293,9 @@ class App(tk.Frame):
self.submit_btn["command"] = self.submit
self.submit_btn.grid(row=5, column=0, rowspan=1, columnspan=2, padx=10, pady=10, sticky=tk.NSEW)
+ self.error_label = tk.Label(self)
+ self.error_label["fg"] = "#ff0000"
+
def change_plot_type(self):
cur_type = self.plot_type.get()
for ptype, widget in self.pw.items():
@@ -280,7 +307,13 @@ class App(tk.Frame):
def submit(self):
cur_type = self.plot_type.get()
widget = self.pw[cur_type]
- print(widget.collect_info())
+ info = widget.collect_info()
+ if info["status"] == "error":
+ self.error_label["text"] = info["message"]
+ self.error_label.grid(row=7, column=0, rowspan=1, columnspan=2, padx=10, pady=5, sticky=tk.NSEW)
+ else:
+ self.error_label.grid_forget()
+ print(info)
def grid_conf(obj, rows, cols, uniform=False):
diff --git a/python-graphics/test.py b/python-graphics/test.py
deleted file mode 100644
index d5838c5..0000000
--- a/python-graphics/test.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import tkinter as tk
-
-class ListFrame(tk.Frame):
- def __init__(self, master, items=[]):
- super().__init__(master)
- self.list = tk.Listbox(self)
- self.scroll = tk.Scrollbar(self, orient=tk.VERTICAL,
- command=self.list.yview)
- self.list.config(yscrollcommand=self.scroll.set)
- self.list.insert(0, *items)
- self.list.pack(side=tk.LEFT)
- self.scroll.pack(side=tk.LEFT, fill=tk.Y)
-
- def pop_selection(self):
- index = self.list.curselection()
- if index:
- value = self.list.get(index)
- self.list.delete(index)
- return value
-
- def insert_item(self, item):
- self.list.insert(tk.END, item)
-
-class App(tk.Tk):
- def __init__(self):
- super().__init__()
- months = ["Январь", "Февраль", "Март", "Апрель",
- "Май", "Июнь", "Июль", "Август", "Сентябрь",
- "Октябрь", "Ноябрь", "Декабрь"]
- self.frame_a = ListFrame(self, months)
- self.frame_b = ListFrame(self)
- self.btn_right = tk.Button(self, text=">",
- command=self.move_right)
- self.btn_left = tk.Button(self, text="<",
- command=self.move_left)
-
- self.frame_a.pack(side=tk.LEFT, padx=10, pady=10)
- self.frame_b.pack(side=tk.RIGHT, padx=10, pady=10)
- self.btn_right.pack(expand=True, ipadx=5)
- self.btn_left.pack(expand=True, ipadx=5)
-
- def move_right(self):
- self.move(self.frame_a, self.frame_b)
- def move_left(self):
- self.move(self.frame_b, self.frame_a)
-
- def move(self, frame_from, frame_to):
- value = frame_from.pop_selection()
- if value:
- frame_to.insert_item(value)
-
-if __name__ == "__main__":
- app = App()
- app.mainloop()
-