diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 19:19:14 +0400 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 19:19:14 +0400 |
| commit | 399b82de92f508b8d96ea0c55d240ee09e0310b3 (patch) | |
| tree | 559cdf4697f0f4ada7d3a7e91a4ff243f18d0b13 | |
| parent | 02bd09ba0d738fab3c502473489d74c0ea32bc49 (diff) | |
Добавил обработку ошибок
| -rw-r--r-- | python-graphics/main.py | 79 | ||||
| -rw-r--r-- | python-graphics/test.py | 55 |
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() - |