Как инициализировать набор переменных для хранения данных в цикле в tkinter? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь сохранить информацию, предоставленную пользователем, путем инициализации переменных перед фактическим кодом.Пользователь обеспечивает ввод через 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()       

Ответы [ 2 ]

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

Спасибо за ваши комментарии @figbeam. Это дало мне идею, и я решил проблему с помощью следующего кода

self.MainPowerTransformer  = dict()

        Param_list = []
        MPT_list_entries = ["Snom_ONAN_","Snom_ONAF1_","Snom_ONAF2_","Z1_","XR_Ratio_",
                              "VHV_","VMV_","Tap_exist_","Num_Taps_","Min_Tap_",
                              "Max_Tap_","NLL_","FLL_"]

        for i in range(300):
            for item in MPT_list_entries:
                Param_list.extend([item+str(i+1)])

        for field in MPT_list_entries:
            self.MainPowerTransformer[field] = tk.DoubleVar()
0 голосов
/ 06 июня 2019

Это было много кода. Я не собираюсь пытаться понять все это, но вот некоторые мысли.

Когда вы используете DoubleVar () в качестве текстовой переменной для записи, он будет вернет ошибку, если вы введете что-либо кроме плавающей запятой Ты можешь хотите использовать StringVar (), а затем проверить ввод.

Со списком имен столбцов вы можете создать dict с помощью цикла for.

MainPowerTransformer = dict()
field_list = ["Snom_ONAN_1", "Snom_ONAF1_1", "Snom_ONAF2_1", "etc."]

for field in field_list:
    MainPowerTransformer[field] = StringVar()
    MainPowerTransformer[field].set('0.0')     # Set default value

Если вы хотите, вы можете получить значения непосредственно из записей с помощью:

S_ONAN_entry.get()

так что вам не придется возиться с разными DoubleVar и StringVar.

Поместите это в цикл над именами столбцов и соберите их все. Вы могли бы возможно, используйте этот цикл для сохранения данных в панде. Но я не работал с пандами, так что вам придется решить это самостоятельно.

Надеюсь, что это может помочь.

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