Я пытаюсь сохранить информацию, предоставленную пользователем, путем инициализации переменных перед фактическим кодом.Пользователь обеспечивает ввод через EntryBoxes в GUI, разработанном с использованием tkinter.
Я хотел бы знать, могу ли я автоматически инициализировать переменные вместо того, чтобы делать это вручную, что я делал в переменной self.MainPowerTransformer.
Я также хотел бы знать, есть ли способ сохранить переменные непосредственно в панде, в форме данных из поля ввода.
Весь код показан ниже
from tkinter import NW
import tkinter as tk
from tkinter import ttk,filedialog,simpledialog,messagebox
import pandas as pd
import csv
import numpy as np
LARGE_FONT = ("Verdana",12)
class WindFarmInput(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self,"Wind Farm Simulation Input")
self.MainPowerTransformer = {
"Snom_ONAN_1" : tk.DoubleVar(),
"Snom_ONAF1_1" : tk.DoubleVar(),
"Snom_ONAF2_1" : tk.DoubleVar(),
"Z1_1" : tk.DoubleVar(),
"XR_Ratio_1" : tk.DoubleVar(),
"VHV_1" : tk.DoubleVar(),
"VMV_1" : tk.DoubleVar(),
"Tap_exist_1" : tk.StringVar(),
"Num_Taps_1" : tk.DoubleVar(),
"Min_Tap_1" : tk.DoubleVar(),
"Max_Tap_1" : tk.DoubleVar(),
"NLL_1" : tk.DoubleVar(),
"FLL_1" : tk.DoubleVar(),
"Snom_ONAN_2" : tk.DoubleVar(),
"Snom_ONAF1_2" : tk.DoubleVar(),
"Snom_ONAF2_2" : tk.DoubleVar(),
"Z1_2" : tk.DoubleVar(),
"XR_Ratio_2" : tk.DoubleVar(),
"VHV_2" : tk.DoubleVar(),
"VMV_2" : tk.DoubleVar(),
"Tap_exist_2" : tk.StringVar(),
"Num_Taps_2" : tk.DoubleVar(),
"Min_Tap_2" : tk.DoubleVar(),
"Max_Tap_2" : tk.DoubleVar(),
"NLL_2" : tk.DoubleVar(),
"FLL_2" : tk.DoubleVar()
}
self.from_bus = {}
self.to_bus = {}
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
self.wind_turb_num = {}
self.WT_connection_info = pd.DataFrame(columns=['Bus Name','WT Model','P(MW)','Qind(MVAR)','Qcap(MVAR)','VLV(kV)'])
self.PadMount_trafo_WT_connection = pd.DataFrame(columns=['Bus Name','WT Model','S(MVA)','VMV(kV)','VLV(kV)','Z(pu)','X\R','NLL(kVAR)','FLL(kVAR)'])
self.frames = {}
self.MPT_Tap = {}
self.MainPowerTrafo_data = pd.DataFrame(columns=['Snom_ONAN','Snom_ONAF1','Snom_ONAF2','Z1','XR_Ratio','VHV','VMV','Tap_exist','Min_Tap',
'Max_Tap','NLL','FLL'])
for F in (StartPage,MainPowerTransformerEntry):
frame = F(container,self)
self.frames[F] = frame
frame.grid(row=1,column=1,sticky="nsew")
self.show_frame(StartPage)
def show_frame(self,cont):
frame = self.frames[cont]
frame.tkraise()
def get_page(self, page_class):
return self.frames[page_class]
class StartPage(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
label = ttk.Label(self, text="Start Page",font=LARGE_FONT)
label.pack(pady=10,padx=10)
button = ttk.Button(self,text="Next", command=lambda:controller.show_frame(MainPowerTransformerEntry))
button.pack()
button1 = ttk.Button(self,text="Quit", command=lambda:controller.destroy)
button1.pack()
class MainPowerTransformerEntry(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.controller=controller
top_frame = tk.Frame(self)
top_frame.pack()
middle_frame = tk.Frame(self)
middle_frame.pack()
self.canvas = tk.Canvas(middle_frame,width=700,height=330,borderwidth=0, background="#ffffff")
self.canvas.pack(side="top",fill="both",expand=True)
# self.canvas.grid(row=1,column=1,columnspan=4,sticky="news")
scrollbarx = tk.Scrollbar(middle_frame,orient="horizontal",command=self.canvas.xview)
self.canvas.configure(xscrollcommand=scrollbarx.set)
scrollbarx.pack(side="bottom",fill="x")
# scrollbarx.pack(row=3,column=1,sticky='ew')
frame_buttons = tk.Frame(self.canvas,padx=10,pady=10)
self.canvas.create_window((0, 0), window=frame_buttons, anchor='nw')
frame_buttons.bind("<Configure>", self.onFrameConfigure)
label = tk.Label(top_frame, text="Main Power Transformer Data",font=LARGE_FONT)
label.grid(row=1,column=2,columnspan=6)
button1 = ttk.Button(top_frame,text="Back",command=lambda:controller.show_frame(StartPage))
button1.grid(row=2,column=0,columnspan=2)
button2 = ttk.Button(top_frame,text="Enter Data", command=lambda:self.enter_data(controller,frame_buttons))
button2.grid(row=2,column=3,columnspan=2)
button3 = ttk.Button(top_frame,text="Next", command=lambda:[self.save_data(controller),self.controller.show_frame(MainPowerTransformerEntry)])
button3.grid(row=2,column=5,columnspan=2)
def enter_data(self,controller,frame_buttons):
MPT_NUM = simpledialog.askinteger("Input Main Power Transformer Number","Enter the total number of main power transformer")
self.MainPowerTransformerNumber = MPT_NUM
MPT_Num = tk.Label(frame_buttons, text="MPT Number",font=LARGE_FONT)
MPT_Num.grid(row=1, column=1,columnspan=2)
Snom = tk.Label(frame_buttons, text="Snom(ONAN) [MVA]",font=LARGE_FONT,wraplength=120)
Snom.grid(row=1, column=3,columnspan=2)
Snom1 = tk.Label(frame_buttons, text="Snom(ONAF1) [MVA]",font=LARGE_FONT,wraplength=120)
Snom1.grid(row=1, column=5,columnspan=2)
Snom2 = tk.Label(frame_buttons, text="Snom(ONAF2) [MVA]",font=LARGE_FONT,wraplength=120)
Snom2.grid(row=1, column=7,columnspan=2)
Z1 = tk.Label(frame_buttons, text="Z1 (%)",font=LARGE_FONT)
Z1.grid(row=1, column=9,columnspan=1)
XR_Ratio = tk.Label(frame_buttons, text="X/R",font=LARGE_FONT)
XR_Ratio.grid(row=1, column=10,columnspan=1)
VHV = tk.Label(frame_buttons, text="High Voltage (kV)",font=LARGE_FONT,wraplength=120)
VHV.grid(row=1, column=11,columnspan=2)
VMV = tk.Label(frame_buttons, text="Medium Voltage (kV)",font=LARGE_FONT,wraplength=150)
VMV.grid(row=1, column=13,columnspan=2)
Tap_changer = tk.Label(frame_buttons, text="Tap Changer",font=LARGE_FONT)
Tap_changer.grid(row=1, column=15,columnspan=2)
Min_Tap = tk.Label(frame_buttons, text="Minimum Tap Changer (%)",font=LARGE_FONT,wraplength=120)
Min_Tap.grid(row=1, column=17,columnspan=2)
Max_Tap = tk.Label(frame_buttons, text="Maximum Tap Changer (%)",font=LARGE_FONT,wraplength=120)
Max_Tap.grid(row=1, column=19,columnspan=2)
NLL = tk.Label(frame_buttons, text="No Load Losses (MW)",font=LARGE_FONT,wraplength=120)
NLL.grid(row=1, column=21,columnspan=2)
FLL = tk.Label(frame_buttons, text="Full Load Losses (MW)",font=LARGE_FONT,wraplength=120)
FLL.grid(row=1, column=23,columnspan=2)
list_Min_Tap = []
list_Max_Tap = []
for i in range(MPT_NUM):
MPT_label = tk.Label(frame_buttons, text="MPT Num {}: ".format(i+1))
MPT_label.grid(row=i+2, column=1,columnspan=2)
S_ONAN_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Snom_ONAN_"+str(i+1)],width=10 )
S_ONAN_entry.grid(row=i+2, column=3,columnspan=2)
S_ONAF1_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Snom_ONAF1_"+str(i+1)],width=10)
S_ONAF1_entry.grid(row=i+2, column=5,columnspan=2)
S_ONAF2_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Snom_ONAF2_"+str(i+1)],width=10)
S_ONAF2_entry.grid(row=i+2, column=7,columnspan=2)
Z1_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Z1_"+str(i+1)],width=8)
Z1_entry.grid(row=i+2, column=9,columnspan=1)
XR_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["XR_Ratio_"+str(i+1)],width=8)
XR_entry.grid(row=i+2, column=10,columnspan=1)
VHV_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["VHV_"+str(i+1)],width=10)
VHV_entry.grid(row=i+2, column=11,columnspan=2)
VMV_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["VMV_"+str(i+1)],width=10)
VMV_entry.grid(row=i+2, column=13,columnspan=2)
Tap_Combo = ttk.Combobox(frame_buttons,values=['Yes','No'],height=2,width=6)
Tap_Combo.grid(row=i+2, column=15,columnspan=2)
self.controller.MPT_Tap[i] = Tap_Combo
Tap_Combo.bind("<<ComboboxSelected>>", lambda event, i=i:self.tap_change_selection(event,i,list_Min_Tap,list_Max_Tap))
Min_Tap_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Min_Tap_"+str(i+1)],width=10)
Min_Tap_entry.grid(row=i+2, column=17,columnspan=2)
list_Min_Tap.append(Min_Tap_entry)
Max_Tap_entry = tk.Entry(frame_buttons, textvariable=self.controller.MainPowerTransformer["Max_Tap_"+str(i+1)],width=10)
Max_Tap_entry.grid(row=i+2, column=19,columnspan=2)
list_Max_Tap.append(Max_Tap_entry)
NLL_entry = tk.Entry(frame_buttons,textvariable=self.controller.MainPowerTransformer["NLL_"+str(i+1)],width=10)
NLL_entry.grid(row=i+2, column=21,columnspan=2)
FLL_entry = tk.Entry(frame_buttons,textvariable=self.controller.MainPowerTransformer["FLL_"+str(i+1)],width=10)
FLL_entry.grid(row=i+2, column=23,columnspan=2)
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def tap_change_selection(self,event,i,list_Min_Tap,list_Max_Tap):
idx = self.controller.MPT_Tap[i].current()
print(idx) # 1 corresponds to No and 0 corresponds to Yes based on ordering in combobox
if idx > 0: # Implies No Tap Changer
self.controller.MainPowerTransformer["Min_Tap_"+str(i+1)].set(0)
list_Min_Tap[i].config(state='disabled')
self.controller.MainPowerTransformer["Max_Tap_"+str(i+1)].set(0)
list_Max_Tap[i].config(state='disabled')
print('disabled')
elif idx == 0:
list_Min_Tap[i].config(state='normal')
list_Max_Tap[i].config(state='normal')
print('normal')
else:
messagebox.showwarning("Incorrect Enter for Tap Changer")
def save_data(self,controller):
MPT_NUM = self.MainPowerTransformerNumber
for i in range(MPT_NUM):
self.controller.MainPowerTrafo_data.loc[i] = [self.controller.MainPowerTransformer["Snom_ONAN_"+str(i+1)].get(),
self.controller.MainPowerTransformer["Snom_ONAF1_"+str(i+1)].get(),
self.controller.MainPowerTransformer["Snom_ONAF2_"+str(i+1)].get(),
self.controller.MainPowerTransformer["Z1_"+str(i+1)].get(),
self.controller.MainPowerTransformer["XR_Ratio_"+str(i+1)].get(),
self.controller.MainPowerTransformer["VHV_"+str(i+1)].get(),
self.controller.MainPowerTransformer["VMV_"+str(i+1)].get(),
self.controller.MPT_Tap[i].current(),
self.controller.MainPowerTransformer["Min_Tap_"+str(i+1)].get(),
self.controller.MainPowerTransformer["Max_Tap_"+str(i+1)].get(),
self.controller.MainPowerTransformer["NLL_"+str(i+1)].get(),
self.controller.MainPowerTransformer["FLL_"+str(i+1)].get()
]
print(self.controller.MainPowerTrafo_data)
full_path = r'C:\GUI App 2\MPTData.csv'
export_csv = self.controller.MainPowerTrafo_data.to_csv (full_path, index = None, header=True)
app = WindFarmInput()
app.geometry("700x400")
#WindFarmInput().pack(side="top", fill="both", expand=True)
app.mainloop()