{"id":575,"date":"2020-06-13T02:58:33","date_gmt":"2020-06-13T09:58:33","guid":{"rendered":"http:\/\/gantovnik.com\/bio-tips\/?p=575"},"modified":"2020-06-13T02:59:16","modified_gmt":"2020-06-13T09:59:16","slug":"83-application-saving-the-data-to-csv-file","status":"publish","type":"post","link":"https:\/\/gantovnik.com\/bio-tips\/2020\/06\/83-application-saving-the-data-to-csv-file\/","title":{"rendered":"#83 Application, Saving the data to csv file"},"content":{"rendered":"<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/06\/2020-06-13_025234.jpg?resize=626%2C559\" alt=\"\" width=\"626\" height=\"559\" class=\"alignnone size-full wp-image-577\" srcset=\"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/06\/2020-06-13_025234.jpg?w=626&amp;ssl=1 626w, https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/06\/2020-06-13_025234.jpg?resize=300%2C268&amp;ssl=1 300w\" sizes=\"(max-width: 626px) 100vw, 626px\" \/><\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nfrom datetime import datetime\r\nimport os\r\nimport csv\r\nimport tkinter as tk\r\nfrom tkinter import ttk\r\n\r\n\r\nclass LabelInput(tk.Frame):\r\n    &quot;&quot;&quot;A widget containing a label and input together.&quot;&quot;&quot;\r\n\r\n    def __init__(self, parent, label='', input_class=ttk.Entry,\r\n                 input_var=None, input_args=None, label_args=None,\r\n                 **kwargs):\r\n        super().__init__(parent, **kwargs)\r\n        input_args = input_args or {}\r\n        label_args = label_args or {}\r\n        self.variable = input_var\r\n\r\n        if input_class in (ttk.Checkbutton, ttk.Button, ttk.Radiobutton):\r\n            input_args&#x5B;&quot;text&quot;] = label\r\n            input_args&#x5B;&quot;variable&quot;] = input_var\r\n        else:\r\n            self.label = ttk.Label(self, text=label, **label_args)\r\n            self.label.grid(row=0, column=0, sticky=(tk.W + tk.E))\r\n            input_args&#x5B;&quot;textvariable&quot;] = input_var\r\n\r\n        self.input = input_class(self, **input_args)\r\n        self.input.grid(row=1, column=0, sticky=(tk.W + tk.E))\r\n        self.columnconfigure(0, weight=1)\r\n\r\n    def grid(self, sticky=(tk.E + tk.W), **kwargs):\r\n        super().grid(sticky=sticky, **kwargs)\r\n\r\n    def get(self):\r\n        if self.variable:\r\n            return self.variable.get()\r\n        elif type(self.input) == tk.Text:\r\n            return self.input.get('1.0', tk.END)\r\n        else:\r\n            return self.input.get()\r\n\r\n    def set(self, value, *args, **kwargs):\r\n        if type(self.variable) == tk.BooleanVar:\r\n                self.variable.set(bool(value))\r\n        elif self.variable:\r\n                self.variable.set(value, *args, **kwargs)\r\n        elif type(self.input).__name__.endswith('button'):\r\n            if value:\r\n                self.input.select()\r\n            else:\r\n                self.input.deselect()\r\n        elif type(self.input) == tk.Text:\r\n            self.input.delete('1.0', tk.END)\r\n            self.input.insert('1.0', value)\r\n        else:\r\n            self.input.delete(0, tk.END)\r\n            self.input.insert(0, value)\r\n\r\n\r\nclass DataRecordForm(tk.Frame):\r\n    &quot;&quot;&quot;The input form for our widgets&quot;&quot;&quot;\r\n\r\n    def __init__(self, parent, *args, **kwargs):\r\n        super().__init__(parent, *args, **kwargs)\r\n        # A dict to keep track of input widgets\r\n        self.inputs = {}\r\n\r\n        # Build the form\r\n        # recordinfo section\r\n        recordinfo = tk.LabelFrame(self, text=&quot;Record Information&quot;)\r\n\r\n        # line 1\r\n        self.inputs&#x5B;'Date'] = LabelInput(\r\n            recordinfo, &quot;Date&quot;,\r\n            input_var=tk.StringVar()\r\n        )\r\n        self.inputs&#x5B;'Date'].grid(row=0, column=0)\r\n        self.inputs&#x5B;'Time'] = LabelInput(\r\n            recordinfo, &quot;Time&quot;,\r\n            input_class=ttk.Combobox,\r\n            input_var=tk.StringVar(),\r\n            input_args={&quot;values&quot;: &#x5B;&quot;8:00&quot;, &quot;12:00&quot;, &quot;16:00&quot;, &quot;20:00&quot;]}\r\n        )\r\n        self.inputs&#x5B;'Time'].grid(row=0, column=1)\r\n        self.inputs&#x5B;'Technician'] = LabelInput(\r\n            recordinfo, &quot;Technician&quot;,\r\n            input_var=tk.StringVar()\r\n        )\r\n        self.inputs&#x5B;'Technician'].grid(row=0, column=2)\r\n\r\n        # line 2\r\n        self.inputs&#x5B;'Lab'] = LabelInput(\r\n            recordinfo, &quot;Lab&quot;,\r\n            input_class=ttk.Combobox,\r\n            input_var=tk.StringVar(),\r\n            input_args={&quot;values&quot;: &#x5B;&quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;E&quot;]}\r\n        )\r\n        self.inputs&#x5B;'Lab'].grid(row=1, column=0)\r\n        self.inputs&#x5B;'Plot'] = LabelInput(\r\n            recordinfo, &quot;Plot&quot;,\r\n            input_class=ttk.Combobox,\r\n            input_var=tk.IntVar(),\r\n            input_args={&quot;values&quot;: list(range(1, 21))}\r\n        )\r\n        self.inputs&#x5B;'Plot'].grid(row=1, column=1)\r\n        self.inputs&#x5B;'Seed sample'] = LabelInput(\r\n            recordinfo, &quot;Seed sample&quot;,\r\n            input_var=tk.StringVar()\r\n        )\r\n        self.inputs&#x5B;'Seed sample'].grid(row=1, column=2)\r\n\r\n        recordinfo.grid(row=0, column=0, sticky=(tk.W + tk.E))\r\n\r\n        # Environment Data\r\n        environmentinfo = tk.LabelFrame(self, text=&quot;Environment Data&quot;)\r\n        self.inputs&#x5B;'Humidity'] = LabelInput(\r\n            environmentinfo, &quot;Humidity (g\/m\u00b3)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 0.5, &quot;to&quot;: 52.0, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Humidity'].grid(row=0, column=0)\r\n        self.inputs&#x5B;'Light'] = LabelInput(\r\n            environmentinfo, &quot;Light (klx)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 100, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Light'].grid(row=0, column=1)\r\n        self.inputs&#x5B;'Temperature'] = LabelInput(\r\n            environmentinfo, &quot;Tenmperature (\u00b0C)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 4, &quot;to&quot;: 40, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Temperature'].grid(row=0, column=2)\r\n        self.inputs&#x5B;'Equipment Fault'] = LabelInput(\r\n            environmentinfo, &quot;Equipment Fault&quot;,\r\n            input_class=ttk.Checkbutton,\r\n            input_var=tk.BooleanVar()\r\n        )\r\n        self.inputs&#x5B;'Equipment Fault'].grid(row=1, column=0, columnspan=3)\r\n        environmentinfo.grid(row=1, column=0, sticky=(tk.W + tk.E))\r\n\r\n        # Plant Data section\r\n        plantinfo = tk.LabelFrame(self, text=&quot;Plant Data&quot;)\r\n\r\n        self.inputs&#x5B;'Plants'] = LabelInput(\r\n            plantinfo, &quot;Plants&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.IntVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 20}\r\n        )\r\n        self.inputs&#x5B;'Plants'].grid(row=0, column=0)\r\n        self.inputs&#x5B;'Blossoms'] = LabelInput(\r\n            plantinfo, &quot;Blossoms&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.IntVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 1000}\r\n        )\r\n        self.inputs&#x5B;'Blossoms'].grid(row=0, column=1)\r\n        self.inputs&#x5B;'Fruit'] = LabelInput(\r\n            plantinfo, &quot;Fruit&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.IntVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 1000}\r\n        )\r\n        self.inputs&#x5B;'Fruit'].grid(row=0, column=2)\r\n\r\n        # Height data\r\n        self.inputs&#x5B;'Min Height'] = LabelInput(\r\n            plantinfo, &quot;Min Height (cm)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 1000, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Min Height'].grid(row=1, column=0)\r\n        self.inputs&#x5B;'Max Height'] = LabelInput(\r\n            plantinfo, &quot;Max Height (cm)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 1000, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Max Height'].grid(row=1, column=1)\r\n        self.inputs&#x5B;'Median Height'] = LabelInput(\r\n            plantinfo, &quot;Median Height (cm)&quot;,\r\n            input_class=tk.Spinbox,\r\n            input_var=tk.DoubleVar(),\r\n            input_args={&quot;from_&quot;: 0, &quot;to&quot;: 1000, &quot;increment&quot;: .01}\r\n        )\r\n        self.inputs&#x5B;'Median Height'].grid(row=1, column=2)\r\n\r\n        plantinfo.grid(row=2, column=0, sticky=(tk.W + tk.E))\r\n\r\n        # Notes section\r\n        self.inputs&#x5B;'Notes'] = LabelInput(\r\n            self, &quot;Notes&quot;,\r\n            input_class=tk.Text,\r\n            input_args={&quot;width&quot;: 75, &quot;height&quot;: 10}\r\n        )\r\n        self.inputs&#x5B;'Notes'].grid(sticky=tk.W, row=3, column=0)\r\n\r\n        # default the form\r\n        self.reset()\r\n\r\n    def get(self):\r\n        &quot;&quot;&quot;Retrieve data from form as a dict&quot;&quot;&quot;\r\n\r\n        # We need to retrieve the data from Tkinter variables\r\n        # and place it in regular Python objects\r\n\r\n        data = {}\r\n        for key, widget in self.inputs.items():\r\n            data&#x5B;key] = widget.get()\r\n        return data\r\n\r\n    def reset(self):\r\n        &quot;&quot;&quot;Resets the form entries&quot;&quot;&quot;\r\n\r\n        # clear all values\r\n        for widget in self.inputs.values():\r\n            widget.set('')\r\n\r\n\r\nclass Application(tk.Tk):\r\n    &quot;&quot;&quot;Application root window&quot;&quot;&quot;\r\n\r\n    def __init__(self, *args, **kwargs):\r\n        super().__init__(*args, **kwargs)\r\n\r\n        self.title(&quot;ABQ Data Entry Application&quot;)\r\n        self.resizable(width=False, height=False)\r\n\r\n        ttk.Label(\r\n            self,\r\n            text=&quot;ABQ Data Entry Application&quot;,\r\n            font=(&quot;TkDefaultFont&quot;, 16)\r\n        ).grid(row=0)\r\n\r\n        self.recordform = DataRecordForm(self)\r\n        self.recordform.grid(row=1, padx=10)\r\n\r\n        self.savebutton = ttk.Button(self, text=&quot;Save&quot;, command=self.on_save)\r\n        self.savebutton.grid(sticky=tk.E, row=2, padx=10)\r\n\r\n        # status bar\r\n        self.status = tk.StringVar()\r\n        self.statusbar = ttk.Label(self, textvariable=self.status)\r\n        self.statusbar.grid(sticky=(tk.W + tk.E), row=3, padx=10)\r\n\r\n        self.records_saved = 0\r\n\r\n    def on_save(self):\r\n        &quot;&quot;&quot;Handles save button clicks&quot;&quot;&quot;\r\n\r\n        # For now, we save to a hardcoded filename with a datestring.\r\n        # If it doesnt' exist, create it,\r\n        # otherwise just append to the existing file\r\n        datestring = datetime.today().strftime(&quot;%Y-%m-%d&quot;)\r\n        filename = &quot;abq_data_record_{}.csv&quot;.format(datestring)\r\n        newfile = not os.path.exists(filename)\r\n\r\n        data = self.recordform.get()\r\n\r\n        with open(filename, 'a') as fh:\r\n            csvwriter = csv.DictWriter(fh, fieldnames=data.keys())\r\n            if newfile:\r\n                csvwriter.writeheader()\r\n            csvwriter.writerow(data)\r\n\r\n        self.records_saved += 1\r\n        self.status.set(\r\n            &quot;{} records saved this session&quot;.format(self.records_saved))\r\n        self.recordform.reset()\r\n\r\n\r\nif __name__ == &quot;__main__&quot;:\r\n\r\n    app = Application()\r\n    app.mainloop()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>from datetime import datetime import os import csv import tkinter as tk from tkinter import ttk class LabelInput(tk.Frame): &quot;&quot;&quot;A widget containing a label and input together.&quot;&quot;&quot; def __init__(self, parent, label=&#8221;, input_class=ttk.Entry, input_var=None, input_args=None, label_args=None, **kwargs): super().__init__(parent, **kwargs) input_args = input_args or {} label_args = label_args or {} self.variable = input_var if input_class in (ttk.Checkbutton, ttk.Button, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"nf_dc_page":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_lmt_disableupdate":"yes","_lmt_disable":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[2,26],"tags":[],"class_list":["post-575","post","type-post","status-publish","format-standard","hentry","category-python","category-tkinter"],"modified_by":"gantovnik","jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8bH0k-9h","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":505,"url":"https:\/\/gantovnik.com\/bio-tips\/2020\/05\/creating-a-better-version-of-python-3-tkinter-hello-world\/","url_meta":{"origin":575,"position":0},"title":"#75 Creating a better version of Python 3 Tkinter Hello World","author":"gantovnik","date":"2020-05-06","format":false,"excerpt":"Creating a better version of Python 3 Tkinter Hello World [code language=\"python\"] import tkinter as tk from tkinter import ttk class HelloView(tk.Frame): \"\"\"A friendly little module\"\"\" def __init__(self, parent, *args, **kwargs): super().__init__(parent, *args, **kwargs) self.name = tk.StringVar() self.hello_string = tk.StringVar() self.hello_string.set(\"Hello World\") name_label = ttk.Label(self, text=\"Name:\") name_entry = ttk.Entry(self, textvariable=self.name)\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/05\/2020-05-06_000413.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":828,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/145-method-create_text-in-tkinter\/","url_meta":{"origin":575,"position":1},"title":"#145 Method create_text in tkinter","author":"gantovnik","date":"2021-01-02","format":false,"excerpt":"#145 Method create_text in tkinter [code language=\"python\"] #!\/usr\/bin\/env python3 from tkinter import Tk, Canvas, Frame, BOTH, W class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title(\"Method create_text in tkinter\") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_text(20, 30, anchor=W, font=\"Comix\", text=\"First line\") canvas.create_text(20, 60, anchor=W, font=\"Comix\", text=\"Second line\") canvas.create_text(20, 130, anchor=W, font=\"Comix\",\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/01\/ex145.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":822,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/143-colors-in-tkinter\/","url_meta":{"origin":575,"position":2},"title":"#143 Colors in tkinter","author":"gantovnik","date":"2021-01-02","format":false,"excerpt":"#143 Colors in tkinter [code language=\"python\"] #!\/usr\/bin\/env python3 from tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title(\"Colors in tkinter\") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_rectangle(30, 10, 120, 80, outline=\"#fb0\", fill=\"#fb0\") canvas.create_rectangle(150, 10, 240, 80, outline=\"#f50\", fill=\"#f50\") canvas.create_rectangle(270, 10, 370, 80, outline=\"#05f\", fill=\"#05f\") canvas.pack(fill=BOTH,\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/01\/ex143.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":819,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/142-method-create_line-in-tkinter\/","url_meta":{"origin":575,"position":3},"title":"#142 Method create_line in tkinter","author":"gantovnik","date":"2021-01-02","format":false,"excerpt":"#142 Method create_line in tkinter [code language=\"python\"] #!\/usr\/bin\/env python3 from tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title(\"Method create_line\") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_line(15, 25, 200, 25) canvas.create_line(300, 35, 300, 200, dash=(4, 2)) canvas.create_line(320, 35, 350, 200, dash=(4, 2)) canvas.create_line(55, 85, 155,\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/01\/ex142.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":502,"url":"https:\/\/gantovnik.com\/bio-tips\/2020\/05\/creating-a-python-3-tkinter-hello-world\/","url_meta":{"origin":575,"position":4},"title":"#74 Creating a Python 3 Tkinter Hello World","author":"gantovnik","date":"2020-05-05","format":false,"excerpt":"Creating a Python 3 Tkinter Hello World [code language=\"python\"] from tkinter import * from tkinter.ttk import * root = Tk() label = Label(root, text=\"Hello World\") label.pack() root.mainloop() [\/code]","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"2020-05-05_233237","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2020\/05\/2020-05-05_233237.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":825,"url":"https:\/\/gantovnik.com\/bio-tips\/2021\/01\/144-shapes-in-tkinter\/","url_meta":{"origin":575,"position":5},"title":"#144 Shapes in tkinter","author":"gantovnik","date":"2021-01-02","format":false,"excerpt":"#144 Shapes in tkinter [code language=\"python\"] #!\/usr\/bin\/env python3 from tkinter import Tk, Canvas, Frame, BOTH class Example(Frame): def __init__(self): super().__init__() self.initUI() def initUI(self): self.master.title(\"Shapes in tkinter\") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_oval(10, 10, 80, 80, outline=\"#080808\", fill=\"#1f1\", width=2) canvas.create_oval(110, 10, 210, 80, outline=\"#080808\", fill=\"#1f1\", width=2) canvas.create_rectangle(230, 10, 290, 60, outline=\"#080808\",\u2026","rel":"","context":"In &quot;python&quot;","block_context":{"text":"python","link":"https:\/\/gantovnik.com\/bio-tips\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/gantovnik.com\/bio-tips\/wp-content\/uploads\/2021\/01\/2021-01-02_210714.png?resize=350%2C200","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts\/575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/comments?post=575"}],"version-history":[{"count":0,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/posts\/575\/revisions"}],"wp:attachment":[{"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/media?parent=575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/categories?post=575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gantovnik.com\/bio-tips\/wp-json\/wp\/v2\/tags?post=575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}