如何初始化一组变量以在tkinter中的循环中存储数据?

时间:2019-05-27 16:14:45

标签: python-3.x tkinter

我试图通过在实际代码之前初始化变量来保存用户提供的信息。用户通过使用tkinter开发的GUI中的EntryBoxes提供输入

当前我将变量初始化为

self.PadMountTransformer = {
                "Name1" : tk.StringVar()
                "NumTrafo1":tk.IntVar(),
                "Snom1" : tk.DoubleVar(),
                "MediumVolt1" : tk.DoubleVar(),
                "Z1_1" : tk.DoubleVar(),
                "XR1_Ratio_1" : tk.DoubleVar(),
                "Z0_1" : tk.DoubleVar(),
                "XR0_Ratio_1" : tk.DoubleVar(),
                "LowVolt1" : tk.DoubleVar(),
                "NLL_1": tk.DoubleVar(),
                "FLL_1": tk.DoubleVar(),
                "Name2" : tk.StringVar()
                "NumTrafo2":tk.IntVar(),
                "Snom2" : tk.DoubleVar(),
                "MediumVolt2" : tk.DoubleVar(),
                "Z1_2" : tk.DoubleVar(),
                "XR1_Ratio_2" : tk.DoubleVar(),
                "Z0_2" : tk.DoubleVar(),
                "XR0_Ratio_2" : tk.DoubleVar(),
                "LowVolt2" : tk.DoubleVar(),
                "NLL_2": tk.DoubleVar(),
                "FLL_2": tk.DoubleVar()
                }

输入以

表示
for i in range(CN):
            f_label = tk.Label(frame_buttons, text="Collector {}: ".format(i+1))
            f_label.grid(row=i+3,column=0,columnspan=2)
            NumTrafo = tk.Entry(frame_buttons, textvariable=self.controller.PadMountTransformer["NumTrafo"+str(i+1)])
            NumTrafo.grid(row=i+3, column=2,columnspan=2)
            Snom = tk.Entry(frame_buttons, textvariable=self.controller.PadMountTransformer["Snom"+str(i+1)])
            Snom.grid(row=i+3, column=4,columnspan=2)
            MedVolt = tk.Entry(frame_buttons, textvariable=self.controller.PadMountTransformer["MediumVolt"+str(i+1)])
            MedVolt.grid(row=i+3, column=6,columnspan=2)
            Z1 = tk.Entry(frame_buttons, textvariable=self.controller.PadMountTransformer["Z1_"+str(i+1)])
            Z1.grid(row=i+3, column=8,columnspan=2)

我希望能够定义最大数量的变量并在循环中初始化变量。我试图做这样的事情,但是没用

Max_Trafo_Num = 50;
for i in range(Max_Trafo_Num):
          self.PadMountTransformer.append("NumTrafo"+str(i):tk.IntVar())
          self.PadMountTransformer.append("Snom"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("MediumVolt"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("Z1_"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("XR1_Ratio_"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("Z0_"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("XR0_Ratio_"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("LowVolt"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("NLL_"+str(i):tk.DoubleVar())
          self.PadMountTransformer.append("FLL_"+str(i):tk.DoubleVar())

我还想知道,除了这样做,我还可以将变量直接从输入框输入保存到pandas数据框中。

2 个答案:

答案 0 :(得分:0)

那是很多代码。我不会尝试去理解这一切, 但是这里有一些想法。

当您将DoubleVar()用作条目的文本变量时,它将 如果输入的不是浮点数,则返回错误。你可能 想要使用StringVar()然后验证输入。

使用列名列表,您可以使用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。

将其循环放入列名称中并收集所有名称。你可以 可能使用该循环将数据保存到pandas数据框。但是我 没有与熊猫合作,所以您必须自己解决。

希望这会有所帮助。

答案 1 :(得分:0)

感谢您的评论@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()