diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 18:54:43 +0400 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 18:54:43 +0400 |
| commit | 02bd09ba0d738fab3c502473489d74c0ea32bc49 (patch) | |
| tree | cf9457babdf6b346ff14eef76bfcde32e59517ca | |
| parent | effc0350e37f0cbb012f0740e02838b0bbdc4a94 (diff) | |
Добавил сбор данных из фреймов
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | python-graphics/data.txt | 4 | ||||
| -rw-r--r-- | python-graphics/main.py | 170 |
3 files changed, 107 insertions, 68 deletions
@@ -1,2 +1,3 @@ *.out *.zip +venv diff --git a/python-graphics/data.txt b/python-graphics/data.txt new file mode 100644 index 0000000..197f024 --- /dev/null +++ b/python-graphics/data.txt @@ -0,0 +1,4 @@ +0,0 +1,1 +2,4 +3,9 diff --git a/python-graphics/main.py b/python-graphics/main.py index cd7932e..db22eeb 100644 --- a/python-graphics/main.py +++ b/python-graphics/main.py @@ -19,46 +19,38 @@ class PresetType: class PlotTypeFrame(tk.Frame): - def __init__(self, master, plot_type_var, callback): + def __init__(self, master, plot_type_var, on_type_change): super().__init__(master) self.master = master self.plot_type = plot_type_var - self.callback = callback + self.on_type_change = on_type_change self.create_widgets() def create_widgets(self): - # self.frame = ttk.LabelFrame(self) - # self.frame["text"] = "Тип графика" - self.frame = self - - self.preset_plot = ttk.Radiobutton(self.frame) + self.preset_plot = ttk.Radiobutton(self) self.preset_plot["variable"] = self.plot_type self.preset_plot["text"] = "Предустановленный" self.preset_plot["value"] = PlotType.PRESET - self.preset_plot["command"] = self.callback + self.preset_plot["command"] = self.on_type_change self.preset_plot.grid(row=0, column=0, sticky=tk.W) - # self.preset_plot.pack(side=tk.TOP, expand=True) - self.user_plot = ttk.Radiobutton(self.frame) + self.user_plot = ttk.Radiobutton(self) self.user_plot["variable"] = self.plot_type self.user_plot["text"] = "Пользовательский" self.user_plot["value"] = PlotType.USER - self.user_plot["command"] = self.callback + self.user_plot["command"] = self.on_type_change self.user_plot.grid(row=1, column=0, sticky=tk.W) - # self.user_plot.pack(side=tk.TOP, sticky=tk.W) - self.point_plot = ttk.Radiobutton(self.frame) + self.point_plot = ttk.Radiobutton(self) self.point_plot["variable"] = self.plot_type self.point_plot["text"] = "По точкам" self.point_plot["value"] = PlotType.POINT - self.point_plot["command"] = self.callback + self.point_plot["command"] = self.on_type_change self.point_plot.grid(row=2, column=0, sticky=tk.W) self.preset_plot.invoke() - # self.frame.grid(row=0, column=0, rowspan=3, columnspan=1, ipadx=10) - class PresetPlotFrame(tk.Frame): def __init__(self, master): @@ -68,16 +60,23 @@ class PresetPlotFrame(tk.Frame): self.create_widgets() def create_widgets(self): - self.preset_type = tk.StringVar() - self.options = ttk.OptionMenu( - self, - self.preset_type, - PresetType.options()[0], - *PresetType.options(), - ) - + # Виджеты для указания значений параметров графиков self.variables = {} + self.l_min = tk.Label(self) + self.l_min["text"] = "min(x)" + self.l_min.grid(row=1, column=0) + + self.min = tk.Entry(self) + self.min.grid(row=1, column=1) + + 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) + la = tk.Label(self) la["text"] = "a: " a = tk.Entry(self) @@ -89,27 +88,34 @@ class PresetPlotFrame(tk.Frame): lc = tk.Label(self) lc["text"] = "c: " c = tk.Entry(self) - + + # В соответствие каждому графику ставятся виджеты его переменных. + # None соответствуют все виджеты переменных, чтобы их можно было + # скрывать. self.variables[PresetType.LINE] = [(la, a), (lb, b)] self.variables[PresetType.PARABOLA] = [(la, a), (lb, b), (lc, c)] self.variables[None] = [(la, a), (lb, b), (lc, c)] - self.options.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=tk.NSEW) - + # Изменения этой переменной будут передаваться в метод type_changed + self.preset_type = tk.StringVar() self.preset_type.trace("w", self.type_changed) + self.options = ttk.OptionMenu( + self, + self.preset_type, + PresetType.options()[0], + *PresetType.options(), + ) + self.options.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=tk.NSEW) + def type_changed(self, *args): new_type = self.preset_type.get() - if new_type == PresetType.LINE: - print("line") - elif new_type == PresetType.PARABOLA: - print("parabola") for (label, var) in self.variables[None]: label.grid_forget() var.grid_forget() - for i, (label, var) in enumerate(self.variables[new_type], 1): + for i, (label, var) in enumerate(self.variables[new_type], 3): label.grid(row=i, column=0) var.grid(row=i, column=1) @@ -121,6 +127,32 @@ class PresetPlotFrame(tk.Frame): self.grid_columnconfigure(0, weight=1) self.grid_columnconfigure(1, weight=4) + def collect_info(self): + # TODO: Добавить валидацию данных в этих полях. + cur_type = self.preset_type.get() + v = self.variables[cur_type] + if cur_type == PresetType.PARABOLA: + 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() + } + 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() + } + class UserPlotFrame(tk.Frame): def __init__(self, master): @@ -132,15 +164,11 @@ class UserPlotFrame(tk.Frame): def create_widgets(self): pass - def grid_size(self): - return (2, 1) - def show(self): self.grid(row=0, column=0, columnspan=1, rowspan=2, sticky=tk.NSEW) - self.grid_columnconfigure(0, weight=1) - self.grid_rowconfigure(0, weight=1) - self.grid_rowconfigure(1, weight=1) + def collect_info(self): + return {"status": "ok"} class PointPlotFrame(tk.Frame): @@ -150,6 +178,7 @@ class PointPlotFrame(tk.Frame): self.show() self.create_widgets() + self._path = "" def create_widgets(self): self.choose_file = tk.Button(self) @@ -161,32 +190,43 @@ class PointPlotFrame(tk.Frame): self.filepath.grid(row=1, column=0, sticky=tk.NSEW) def open_file(self): - a = tk.filedialog.askopenfile() - self.filepath.delete(0, tk.END) - self.filepath.insert(0, a.name) - print(a) - - def grid_size(self): - return (2, 1) + file_handle = tk.filedialog.askopenfile() + if file_handle is not None: + self._path = file_handle.name + self.filepath.delete(0, tk.END) + self.filepath.insert(0, file_handle.name) def show(self): - gr, gc = self.grid_size() + gr, gc = (2, 1) self.grid(row=0, column=0, columnspan=gc, rowspan=gr, sticky=tk.NSEW) 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)) + + return {"status": "ok", "graph": "point", "points": points} + class App(tk.Frame): def __init__(self, master): super().__init__(master) - self.grid(row=0, column=0, columnspan=2, rowspan=4, sticky=tk.NSEW) + self.grid(row=0, column=0, columnspan=2, rowspan=6, sticky=tk.NSEW) self.create_widgets() def create_widgets(self): - # Создаём фреймы с настройкой выбранного типа графика + # Создаём фреймы с настройкой выбранного типа графика self.cfg_pt = { "row": 0, "column": 1, - "rowspan": 3, "columnspan": 1, + "rowspan": 5, "columnspan": 1, "padx": 10, "pady": 10, "sticky": tk.NSEW } @@ -194,7 +234,7 @@ class App(tk.Frame): self.right_frame = ttk.LabelFrame(self) self.right_frame["text"] = "Настройка графика" self.right_frame.grid(**self.cfg_pt) - grid_conf(self.right_frame, 3, 1) + grid_conf(self.right_frame, 5, 1) self.preset_plot_frame = PresetPlotFrame(self.right_frame) self.user_plot_frame = UserPlotFrame(self.right_frame) @@ -206,10 +246,10 @@ class App(tk.Frame): PlotType.POINT: self.point_plot_frame, } - # Фрейм с выбором типа графика + # Фрейм с выбором типа графика self.left_frame = ttk.LabelFrame(self) self.left_frame["text"] = "Тип графика" - self.left_frame.grid(row=0, column=0, rowspan=3, columnspan=1, padx=10, pady=10, sticky=tk.NSEW) + self.left_frame.grid(row=0, column=0, rowspan=5, columnspan=1, padx=10, pady=10, sticky=tk.NSEW) self.plot_type = tk.IntVar() @@ -218,7 +258,7 @@ class App(tk.Frame): self.plot_type, self.change_plot_type ) - self.w_plot_type.grid(row=0, column=0, rowspan=3, padx=3, pady=3) + self.w_plot_type.grid(row=0, column=0, rowspan=5, padx=3, pady=3) ############################# @@ -226,40 +266,34 @@ class App(tk.Frame): self.submit_btn = tk.Button(self) self.submit_btn["text"] = "Построить график" - self.submit_btn.grid(row=3, column=0, rowspan=1, columnspan=2, padx=10, pady=10, sticky=tk.NSEW) + 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) def change_plot_type(self): cur_type = self.plot_type.get() for ptype, widget in self.pw.items(): if cur_type == ptype: widget.show() - # gr, gc = widget.grid_size() - - # self.right_frame.grid_forget() - # self.right_frame.grid( - # row=0, column=1, - # rowspan=gr, columnspan=gc, - # padx=10, pady=10, - # sticky=tk.NSEW - # ) - # grid_conf(self.right_frame, gr, gc) else: widget.grid_forget() + def submit(self): + cur_type = self.plot_type.get() + widget = self.pw[cur_type] + print(widget.collect_info()) + def grid_conf(obj, rows, cols, uniform=False): for i in range(rows): obj.grid_rowconfigure(i, weight=1, uniform=uniform) - # tk.Grid.rowconfigure(obj, i, weight=1, uniform=uniform) for i in range(cols): obj.grid_columnconfigure(i, weight=1, uniform=uniform) - # tk.Grid.columnconfigure(obj, i, weight=1, uniform=uniform) if __name__ == "__main__": root = tk.Tk() app = App(root) - grid_conf(app, 4, 2) - grid_conf(root, 4, 2) + grid_conf(app, 6, 2) + grid_conf(root, 6, 2) root.mainloop() |