Невозможно вызвать StringVar из определения (сохранение в определенную строку в .csv на основе раскрывающегося списка) - PullRequest
0 голосов
/ 07 июня 2019

Конечная цель - сохранить код в определенной строке CSV-файла на основе выбранного номера (1-6). Это будет использоваться в качестве элементарной формы проверки данных для использования 6-строчного CSV-файла, что упростит обратный вызов отдельных строк для других функций. Я думаю, что приведенный ниже код не упакован правильно, и поэтому мои вызовы StringVar ' tkvar 'не работает (как это не видно из определения?).

Я пробовал несколько разных итераций для переноса кода, включая оператор if, который сохранял базу на основе выбора, но все, похоже, не сработало из-за «позиции / местоположения» WriteToFile и невозможности вызова tkvar изнутри.

from tkinter import *
from datetime import datetime
import time
import csv
import tkinter
import serial
from time import sleep, strftime, time

class SampleApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self._frame = None
        self.switch_frame(AddMethod)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        #camera.stop_preview()
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.grid(row=1, column=0)

class AddMethod(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        title = Label(self, text="Method Settings").grid(row=0, column=1)
        a1 = Button(self, text='Back', height=5, width=20, command=lambda: master.switch_frame(ManMeth)).grid(row=1, rowspan=2, column=0, sticky='')
        a2 = Button(self, text='Save and Return to Analysis', height=5, width=20, command=lambda:[self.writeToFile, master.switch_frame(ManMeth)]).grid(row=3, rowspan=2, column=0, sticky='')
        a3 = Button(self, text='Save Method', height=5, width=20, command=self.writeToFile).grid(row=5, rowspan=2, column=0, sticky='')
        mthtit = Label(self, text="Method Title", font="12").grid(row=2, column=1, sticky=W)
        sttemp = Label(self, text="Start Temperature", font="12").grid(row=3, column=1, sticky=W)
        wttm = Label(self, text="Waiting Time", font="12").grid(row=4, column=1, sticky=W)
        sktm = Label(self, text="Soaking Time", font="12").grid(row=5, column=1, sticky=W)
        endtemp = Label(self, text="End Temperature", font="12").grid(row=6, column=1, sticky=W)
        htrt = Label(self, text="Heating Rate", font="12").grid(row=7, column=1, sticky=W)
        tkvar = StringVar(self)
        choices = { '1','2','3','4','5','6'}
        tkvar.set('Select') # set the default option
        popupMenu = OptionMenu(self, tkvar, *choices)
        Label(self, text="Quicksave No#").grid(row=1, column=3)
        popupMenu.grid(row=1, column=4)
        # on change dropdown value
        def change_dropdown(*args):
            print(tkvar.get())
            # link function to change dropdown
        tkvar.trace('w', change_dropdown)
        self.checkbutton = Checkbutton(self)
        self.checkbutton.grid(row=1, column=2)
        self.checkbutton.configure(height=3)
        self.chklabel = Label(self)
        self.chklabel.grid(row=1, column=1, sticky=W)
        self.chklabel.configure(text="Ramp to Starting Temperature", font="12")
        self.mthtite = Entry(self, relief=SUNKEN, bd=3)
        self.mthtite.grid(row=2, column=3)
        self.sttempe = Entry(self, relief=SUNKEN, bd=3)
        self.sttempe.grid(row=3, column=3)
        self.wttme = Entry(self, relief=SUNKEN, bd=2)
        self.wttme.grid(row=4, column=3)
        self.sktme = Entry(self, relief=SUNKEN, bd=3)
        self.sktme.grid(row=5, column=3)
        self.endtempe = Entry(self, relief=SUNKEN, bd=3)
        self.endtempe.grid(row=6, column=3)
        self.htrte = Entry(self, relief=SUNKEN, bd=3)
        self.htrte.grid(row=7, column=3)
        sttemp1 = Label(self, text="°C", font="BOLD 12").grid(row=3, column=4, sticky=W)
        wttm1 = Label(self, text="Sec", font="BOLD 12").grid(row=4, column=4, sticky=W)
        sktm1 = Label(self, text="MM:SS", font="BOLD 12").grid(row=5, column=4, sticky=W)
        endtemp1 = Label(self, text="°C", font="BOLD 12").grid(row=6, column=4, sticky=W)
        htrt1 = Label(self, text="°C/Min", font="BOLD 12").grid(row=7, column=4, sticky=W)

        buttons = [
            '~','`','!','@','#','$','%','^','&','*','(',')','-','_','Clear',
            'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P','0','7','8','9','Back',
            'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L','[',']','4','5','6','Tab',
            'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.','?','/','1','2','3','Space',
            ]

        def select(value):


            if value =="Clear":
                Entry.focus_get(self).delete(0, END)
            elif value == "Back":
                widget = Entry.focus_get(self)
                if widget:
                    widget.delete(widget.index("end")-1)
            elif value == "Space":
                Entry.focus_get(self).insert(END, ' ')
            elif value == "Tab":
                Entry.focus_get(self).insert(END, '    ')
            else :
                Entry.focus_get(self).insert(END, value)

        class Keyboard(Frame):
            def __init__(self, root):
                Frame.__init__(self, root)

                def HosoPop():

                        varRow = 2
                        varColumn = 0

                        for button in buttons:

                                command = lambda x=button: select(x)

                                if button == "Clear" or button == "Space" or button == "Tab" or button == "Back":
                                        Button(self,text= button,width=4, height=2, bg="white", fg="black", relief=RAISED,
                                                activebackground = "#ffffff", activeforeground="#3c4987",
                                                command=command).grid(row=varRow,column=varColumn)

                                else:
                                        Button(self,text= button,width=3, height=2, bg="white", fg="black", relief=RAISED,
                                                activebackground = "#ffffff", activeforeground="#3c4987",
                                                command=command).grid(row=varRow,column=varColumn)


                                varColumn +=1 

                                if varColumn > 14 and varRow == 2:
                                        varColumn = 0
                                        varRow+=1
                                if varColumn > 14 and varRow == 3:
                                        varColumn = 0
                                        varRow+=1
                                if varColumn > 14 and varRow == 4:
                                        varColumn = 0
                                        varRow+=1
                HosoPop()

        keys  = Keyboard(self).grid(row=8, column=0, columnspan=4)

    def writeToFile(self):
        mthd_list = []
        # Read all data from the csv file.
        with open('Working_MethodFile.csv', 'rb') as b:
            mthd = csv.reader(b)
            mthd_list.extend(mthd)

        # data to override in the format {line_num_to_override:data_to_write}. 
        line_to_override = {[tkvar.get()]:[self.mthtite.get(), self.sttempe.get(), self.wttme.get(), self.sktme.get(), self.endtempe.get(), self.htrte.get()] }

        # Write data to the csv file and replace the lines in the line_to_override dict.
        with open('Working_MethodFile.csv', 'wb') as b:
            writer = csv.writer(b)
            for line, row in enumerate(mthd_list):
                 data = line_to_override.get(line, row)
                 writer.writerow(data)

    #with open('Working_MethodFile.csv', 'a') as f:
     #   w=csv.writer(f, quoting=csv.QUOTE_ALL)
      #  w.writerow([self.mthtite.get(), self.sttempe.get(), self.wttme.get(), self.sktme.get(), self.endtempe.get(), self.htrte.get()])
if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()  

в настоящее время выдается сообщение об ошибке «NameError: имя 'tkvar' не определено» при попытке сохранить файл. его следует сохранить в соответствующей строке, выбранной в раскрывающемся списке, или выдать ошибку, если раскрывающийся список не выбран.

1 Ответ

0 голосов
/ 07 июня 2019

В функции __init__ вашего AddMethod класса, где вы устанавливаете tkvar = StringVar(self), вы делаете его локальной переменной.Это не поле класса, поэтому после выхода из функции __init__ вы больше не сможете к ней обращаться, что объясняет то, что вы получаете NameError: name 'tkvar' is not defined.

Для этой переменной ивсе остальные, которые вы хотите использовать где-то еще, выполните self.tkvar = StringVar(self), а затем, когда вы обращаетесь к ним внутри класса различными методами, вы можете сделать self.tkvar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...