无法从定义中调用 StringVar(根据下拉列表保存到.csv中的特定行)



最终目标是根据选定的数字(1-6(将代码保存到.csv文件的某一行。这将用作数据验证的基本形式,以使用 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()  

当前,当您尝试保存文件时会引发错误"名称错误:未定义名称'tkvar'"。 它应保存到下拉框中选择的相应行,如果未选择下拉列表,则引发错误。

AddMethod类的__init__函数中,您设置了tkvar = StringVar(self),您将它设置为局部变量。它不是类的字段,因此一旦退出__init__函数,就无法再访问它,这解释了您获得的NameError: name 'tkvar' is not defined

对于该变量以及要在其他地方使用的所有其他变量,执行self.tkvar = StringVar(self),然后当您在类中以不同的方法访问它们时,您可以执行self.tkvar

最新更新