Конечная цель - сохранить код в определенной строке 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' не определено» при попытке сохранить файл. его следует сохранить в соответствующей строке, выбранной в раскрывающемся списке, или выдать ошибку, если раскрывающийся список не выбран.