summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2021-04-04 23:23:05 +0400
committerAndrew Guschin <saintruler@gmail.com>2021-04-04 23:23:05 +0400
commitd7228cd0a9c05b01b6c19cd7ac171aa44b2fd5e8 (patch)
tree1cb75c8e6ee0dafe9f4c87fa7d0140878c189b1a
parentf534258a4428319e1033dbc4c0afaf29b8fd9b05 (diff)
Начал делать задание с графическим интерфейсом
-rw-r--r--python-graphics/main.py176
-rw-r--r--python-graphics/task.txt4
-rw-r--r--python-graphics/test.py55
3 files changed, 235 insertions, 0 deletions
diff --git a/python-graphics/main.py b/python-graphics/main.py
new file mode 100644
index 0000000..9afed98
--- /dev/null
+++ b/python-graphics/main.py
@@ -0,0 +1,176 @@
+import tkinter as tk
+from tkinter import filedialog as fd
+
+
+class PlotType:
+ USER = 1
+ PRESET = 2
+ POINT = 3
+
+
+class PresetPlot:
+ LINE = 0
+ PARABOLA = 1
+
+ OPTIONS = ["ax + b = 0", "ax^2 + bx + c = 0"]
+
+
+class PlotTypeFrame(tk.Frame):
+ def __init__(self, master, plot_type_var, callback):
+ super().__init__(master)
+ self.master = master
+ self.plot_type = plot_type_var
+ self.callback = callback
+
+ self.create_widgets()
+ self.set_style()
+
+ def set_style(self):
+ self.font = (None, "15")
+ # self.font["size"] = 17
+
+ self.bg = "#ffffff"
+ self["bg"] = self.bg
+
+ self.preset_plot["bg"] = self.bg
+ self.preset_plot["font"] = self.font
+ self.preset_plot["bd"] = 0
+
+ self.user_plot["bg"] = self.bg
+ self.user_plot["font"] = self.font
+ self.user_plot["bd"] = 0
+
+ self.point_plot["bg"] = self.bg
+ self.point_plot["font"] = self.font
+ self.point_plot["bd"] = 0
+
+ def create_widgets(self):
+ self.preset_plot = tk.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.grid(row=0, column=0)
+
+ self.user_plot = tk.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.grid(row=1, column=0)
+
+ self.point_plot = tk.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.grid(row=2, column=0)
+
+ self.preset_plot.select()
+
+
+class PresetPlotFrame(tk.Frame):
+ def __init__(self, master, preset_type):
+ super().__init__(master)
+ self.master = master
+ self.preset_type = preset_type
+
+ self.create_widgets()
+
+ def create_widgets(self):
+ self.label = tk.Label(self)
+ self.label["text"] = "Предустановленный"
+ self.label.grid(row=0, column=0)
+
+ self.options = tk.OptionMenu(
+ self,
+ self.preset_type,
+ *PresetPlot.OPTIONS
+ )
+ self.options.grid(row=1, column=0)
+
+
+class UserPlotFrame(tk.Frame):
+ def __init__(self, master):
+ super().__init__(master)
+ self.master = master
+
+ self.create_widgets()
+
+ def create_widgets(self):
+ self.label = tk.Label(self)
+ self.label["text"] = "Пользовательский"
+ self.label.grid(row=0, column=0)
+
+
+class PointPlotFrame(tk.Frame):
+ def __init__(self, master):
+ super().__init__(master)
+ self.master = master
+
+ self.create_widgets()
+
+ def create_widgets(self):
+ self.label = tk.Label(self)
+ self.label["text"] = "Поточечный"
+ self.label.grid(row=0, column=0)
+
+ self.choose_file = tk.Button(self)
+ self.choose_file["text"] = "Выбрать файл"
+ self.choose_file["command"] = self.open_file
+ self.choose_file.grid(row=1, column=0)
+
+ self.filepath = tk.Label(self)
+ self.filepath.grid(row=1, column=1)
+
+ def open_file(self):
+ a = tk.filedialog.askopenfile()
+ self.filepath["text"] = a.name
+ print(a)
+
+
+class App(tk.Tk):
+ def __init__(self):
+ super().__init__()
+ self.geometry("400x250")
+
+ self.create_widgets()
+
+ def create_widgets(self):
+ self.plot_type = tk.IntVar()
+ self.preset_type = tk.IntVar()
+
+ # Фрейм с выбором типа графика
+ self.plot_type_frame = PlotTypeFrame(
+ self,
+ self.plot_type,
+ self.change_plot_type
+ )
+ self.plot_type_frame.pack(side=tk.LEFT)
+
+ # Создаём фреймы с настройкой выбранного типа графика
+ self.preset_plot_frame = PresetPlotFrame(self, self.preset_type)
+ self.user_plot_frame = UserPlotFrame(self)
+ self.point_plot_frame = PointPlotFrame(self)
+
+ self.preset_plot_frame.pack(side=tk.RIGHT)
+
+ def change_plot_type(self):
+ if self.plot_type.get() == PlotType.PRESET:
+ self.preset_plot_frame.pack(side=tk.RIGHT)
+ self.user_plot_frame.pack_forget()
+ self.point_plot_frame.pack_forget()
+ elif self.plot_type.get() == PlotType.USER:
+ self.preset_plot_frame.pack_forget()
+ self.user_plot_frame.pack(side=tk.RIGHT)
+ self.point_plot_frame.pack_forget()
+ elif self.plot_type.get() == PlotType.POINT:
+ self.preset_plot_frame.pack_forget()
+ self.user_plot_frame.pack_forget()
+ self.point_plot_frame.pack(side=tk.RIGHT)
+
+
+if __name__ == "__main__":
+ app = App()
+ app.mainloop()
+
diff --git a/python-graphics/task.txt b/python-graphics/task.txt
new file mode 100644
index 0000000..9bf1110
--- /dev/null
+++ b/python-graphics/task.txt
@@ -0,0 +1,4 @@
+Реализовать приложение, позволяющее работать с графиками: Строить график
+функции (список функций реализовать в виде выпадающего списка), график функции
+введенной пользователем и график функции, построенный по точкам (например,
+экспериментальные данные), считывающийся из файла.
diff --git a/python-graphics/test.py b/python-graphics/test.py
new file mode 100644
index 0000000..d5838c5
--- /dev/null
+++ b/python-graphics/test.py
@@ -0,0 +1,55 @@
+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()
+