diff options
| author | Andrew Guschin <saintruler@gmail.com> | 2021-04-04 23:23:05 +0400 |
|---|---|---|
| committer | Andrew Guschin <saintruler@gmail.com> | 2021-04-04 23:23:05 +0400 |
| commit | d7228cd0a9c05b01b6c19cd7ac171aa44b2fd5e8 (patch) | |
| tree | 1cb75c8e6ee0dafe9f4c87fa7d0140878c189b1a | |
| parent | f534258a4428319e1033dbc4c0afaf29b8fd9b05 (diff) | |
Начал делать задание с графическим интерфейсом
| -rw-r--r-- | python-graphics/main.py | 176 | ||||
| -rw-r--r-- | python-graphics/task.txt | 4 | ||||
| -rw-r--r-- | python-graphics/test.py | 55 |
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() + |