diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 17:39:32 +0400 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2021-04-05 17:39:32 +0400 |
| commit | effc0350e37f0cbb012f0740e02838b0bbdc4a94 (patch) | |
| tree | 68d7d807411af8e6ffd1fb5ff6ef0595a41fe1b9 | |
| parent | cc45ab13adf5f06ae3fc7c2334b63ef8f8c79a23 (diff) | |
Сделал виджет предустановленных графиков
| -rw-r--r-- | python-graphics/main.py | 128 |
1 files changed, 103 insertions, 25 deletions
diff --git a/python-graphics/main.py b/python-graphics/main.py index 300a10a..cd7932e 100644 --- a/python-graphics/main.py +++ b/python-graphics/main.py @@ -9,11 +9,13 @@ class PlotType: POINT = 3 -class PresetPlot: - LINE = 0 - PARABOLA = 1 +class PresetType: + LINE = "ax + b = 0" + PARABOLA = "ax^2 + bx + c = 0" - OPTIONS = ["ax + b = 0", "ax^2 + bx + c = 0"] + @classmethod + def options(cls): + return [cls.LINE, cls.PARABOLA] class PlotTypeFrame(tk.Frame): @@ -59,21 +61,65 @@ class PlotTypeFrame(tk.Frame): class PresetPlotFrame(tk.Frame): - def __init__(self, master, preset_type): + def __init__(self, master): super().__init__(master) self.master = master - self.preset_type = preset_type self.create_widgets() def create_widgets(self): + self.preset_type = tk.StringVar() self.options = ttk.OptionMenu( self, self.preset_type, - PresetPlot.OPTIONS[0], - *PresetPlot.OPTIONS + PresetType.options()[0], + *PresetType.options(), ) - self.options.grid(row=0, column=0, columnspan=1, rowspan=1, sticky=tk.NSEW) + + self.variables = {} + + la = tk.Label(self) + la["text"] = "a: " + a = tk.Entry(self) + + lb = tk.Label(self) + lb["text"] = "b: " + b = tk.Entry(self) + + lc = tk.Label(self) + lc["text"] = "c: " + c = tk.Entry(self) + + 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) + + self.preset_type.trace("w", self.type_changed) + + 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): + label.grid(row=i, column=0) + var.grid(row=i, column=1) + + def grid_size(self): + return (4, 2) + + def show(self): + self.grid(row=0, column=0, columnspan=2, rowspan=4, sticky=tk.NSEW) + self.grid_columnconfigure(0, weight=1) + self.grid_columnconfigure(1, weight=4) class UserPlotFrame(tk.Frame): @@ -86,46 +132,58 @@ 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) + class PointPlotFrame(tk.Frame): def __init__(self, master): super().__init__(master) self.master = master - + + self.show() self.create_widgets() def create_widgets(self): self.choose_file = tk.Button(self) self.choose_file["text"] = "Выбрать файл" self.choose_file["command"] = self.open_file - self.choose_file.grid(row=0, column=0, sticky=tk.NSEW) + self.choose_file.grid(row=0, column=0, columnspan=1, rowspan=1, padx=3, pady=3, sticky=tk.NSEW) self.filepath = tk.Entry(self) - self.filepath.grid(row=1, column=0) + self.filepath.grid(row=1, column=0, sticky=tk.NSEW) def open_file(self): a = tk.filedialog.askopenfile() - # self.filepath.set(a.name) - # print(self.filepath.get()) self.filepath.delete(0, tk.END) self.filepath.insert(0, a.name) print(a) + def grid_size(self): + return (2, 1) + + def show(self): + gr, gc = self.grid_size() + self.grid(row=0, column=0, columnspan=gc, rowspan=gr, sticky=tk.NSEW) + grid_conf(self, gr, gc) + class App(tk.Frame): def __init__(self, master): super().__init__(master) - # self.geometry("400x250") - self.grid(row=0, column=0, columnspan=2, rowspan=4) - self.grid_columnconfigure(0, weight=1, uniform="foo") - self.grid_columnconfigure(1, weight=1, uniform="foo") + self.grid(row=0, column=0, columnspan=2, rowspan=4, sticky=tk.NSEW) self.create_widgets() def create_widgets(self): # Создаём фреймы с настройкой выбранного типа графика - self.preset_type = tk.IntVar() - self.cfg_pt = { "row": 0, "column": 1, "rowspan": 3, "columnspan": 1, @@ -136,12 +194,12 @@ 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) - self.preset_plot_frame = PresetPlotFrame(self.right_frame, self.preset_type) + self.preset_plot_frame = PresetPlotFrame(self.right_frame) self.user_plot_frame = UserPlotFrame(self.right_frame) self.point_plot_frame = PointPlotFrame(self.right_frame) - # self.preset_plot_frame.pack(side=tk.RIGHT) self.pw = { PlotType.PRESET: self.preset_plot_frame, PlotType.USER: self.user_plot_frame, @@ -168,20 +226,40 @@ class App(tk.Frame): self.submit_btn = tk.Button(self) self.submit_btn["text"] = "Построить график" - # self.submit_btn.grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky=tk.W) - self.submit_btn.grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky=tk.NSEW) + self.submit_btn.grid(row=3, 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.grid(column=0, row=0, padx=10, pady=10) + 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 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) root.mainloop() |