微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何清除这么长的变量列表?

如何解决如何清除这么长的变量列表?

在tkinter循环中,我有一个变量列表,用于存储用户输入的文本字符串。我在tkinter中使用www.something.com/send-something/233?search=profile方法将tkinter文本变量分配给常规python变量。然后,我将这些变量传递给函数并返回它们。但是变得很混乱。

从技术上讲,它可以正常工作,但是我想让它看起来更好。我包括nothing sent(这是.get中的文件),以说明如何传递变量并将其返回给其他函数。所有其他功能都是这样设计的。

主要:

check_inputs()

checkInputsMaster.py# obtains user inputted variables from GUI and Feeds them into all other modules folderPath,ship,flightNumber,flightDate,testNumber,missionNumber,pilot,tc,ops,missionType,etd,eta,sw,tm,gps,rdr,rtas,rswb,rmwb,lswb,lmwb,slam = check_inputs(folder_path,ship1,flight_number,flight_date,test_number,mission_number,pilot1,tc1,ops1,mission_type,etd1,eta1,sw1,var1,var2,var3,var4,var5,var6,var7,var8,var9) flightParameters = [folderPath,slam] # test command print(flightParameters) # main chunk of code that creates paperwork check_errors(*flightParameters) logger(*flightParameters) 中的功能

check_inputs()

解决方法

您可以尝试将GUI包装在一个类中,该类以namedtuple或(dataclass)的形式返回数据,如果您正在寻找更灵活的方法。另外,如果您的GUI元素太多,则可能需要考虑将其分成较小的子GUI。

如果输入变量列表很长,您也可以查看kwargs

下面的namedtuple类的简单示例。

import tkinter as tk
from collections import namedtuple

class SimpleGUI:
    def __init__(self):
        self.window = tk.Tk()
        self.window.title('Simple GUI')

        self.var1 = tk.StringVar()
        self.var2 = tk.StringVar()

        frame = tk.Frame(self.window)
        frame.grid(sticky='nesw')

        entry = tk.Entry(frame,textvariable=self.var1)
        entry.grid(row=1,column=1,sticky='nesw')

        entry = tk.Entry(frame,textvariable=self.var2)
        entry.grid(row=1,column=2,sticky='nesw')
        
    def get_variables(self):
        Variables = namedtuple('Variables',['var1','var2'])
        return Variables(self.var1.get(),self.var2.get())
>>> from simplegui import SimpleGUI
>>> gui = SimpleGUI() # Here I enter 'test1' and 'test2' into the tkinter window
>>> vars = gui.get_variables()
>>> vars
Variables(var1='test 1',var2='test 2')
>>> vars.var1
'test 1'
>>> vars.var2
'test 2'
,

确实有更好的方法可以做到这一点。朝正确方向迈出的一步是将您的所有信息存储在词典中,而不是列表中。 flightParameters只是将您的所有数据排成一排,并且可以正常工作,但是通过词典,您可以命名其中的所有数据,而不必按数字引用每个项目。

接下来,没有理由像这样将大量变量传递给您的check_inputs函数;尤其是因为您立即告诉程序使用变量的全局版本;这也很奇怪,因为您将所有这些变量都返回了。我不会做任何事情,只是将您所有的.get存储到一个字典中,该字典返回您的主要代码并另存为flightParameters。

示例更改为第一部分:

# obtains user inputted variables from GUI and feeds them into all other modules
flightParameters = check_inputs() # this will call check_inputs() and then save what it returns to flightParameters
# test command print(flightParameters)

# main chunk of code that creates paperwork
check_errors(*flightParameters)
logger(*flightParameters)

示例更改为第二部分:

def check_inputs():
    print('--------------------------\nProgram starting.\nGrabbing User Input Variables')
    flight_parameters = {} # empty dictionary
    
    flight_parameters['folderPath']=folder_path.get()
    flight_parameters['ship']=ship1.get()
    flight_parameters['flightNumber']=flight_number.get()
    flight_parameters['flightDate']=flight_date.get()
    flight_parameters['testNumber']=test_number.get()
    flight_parameters['missionNumber']=mission_number.get()
    flight_parameters['pilot']=pilot1.get()
    flight_parameters['tc']=tc1.get()
    flight_parameters['ops']=ops1.get()
    flight_parameters['missionType']=mission_type.get()
    flight_parameters['etd']=etd1.get()
    flight_parameters['eta']=eta1.get()
    flight_parameters['sw']=sw1.get()

    flight_parameters['tm']=var1.get()
    flight_parameters['gps']=var2.get()
    flight_parameters['rdr']=var3.get()
    flight_parameters['rtas']=var4.get()
    flight_parameters['rswb']=var5.get()
    flight_parameters['rmwb']=var6.get()
    flight_parameters['lswb']=var7.get()
    flight_parameters['lmwb']=var8.get()
    flight_parameters['slam']=var9.get()

    print('Variables have been grabbed')

    return flight_parameter # return the now-filled dictionary

如果以这种方式进行操作,那么那里的疯狂确实要少得多。您将必须这样访问数据:

flightParameters['flightNumber']

而不是这样做:

flightParameters[2]

您可能还要考虑将所有StringVar都保存在字典中。然后,您可以将check_inputs替换为以下内容:

def check_inputs():
    print('--------------------------\nProgram starting.\nGrabbing User Input Variables')
    flight_parameters = {}
    for i in my_string_vars:
        flight_parameters[i] = my_string_vars[i].get()
    print('Variables have been grabbed')
    return(flight_parameters)
,

为此,我绝对会使用dataclass。这是我的原因:

  1. 您可以按正确的顺序分配所有变量,而不是一次分配一个名称
  2. 您基本上是在创建与typedef等价的python等效项,因此,它不会让您仅修饰名称,拼写错误等。仅允许您定义。
  3. 您不必key的名称(例如:myDC['myVar'])就可以像属性(例如:myDC.myVar)一样引用它们
  4. 您可以默认dataclass的值,并且仅覆盖需要更改的内容。
  5. 值是严格输入的
  6. 如有必要,可以轻松转换为字典
  7. 这实际上消除了对功能的任何需求
  8. 您可以将数据划分为有意义的组,然后将它们重新组合为“超级组”(下面的示例)

from dataclasses import dataclass,asdict

@dataclass
class BaseSpecs:
    folderPath   :str = ''
    ship         :str = ''
    flightNumber :str = ''
    flightDate   :str = ''
    testNumber   :str = ''


@dataclass
class MissionSpecs:
    missionNumber :str = ''
    pilot         :str = ''
    tc            :str = ''
    ops           :str = ''
    missionType   :str = ''
    eta           :str = ''
    etd           :str = ''
    sw            :str = ''
    

@dataclass
class FlightSpecs:
    tm   :str = ''
    gps  :str = ''
    rdr  :str = ''
    rtas :str = ''
    rswb :str = ''
    rmwb :str = ''
    lswb :str = ''
    lmwb :str = ''
    slam :str = ''
    
    
@dataclass            #order is last to first
class FlightParameters(FlightSpecs,MissionSpecs,BaseSpecs):
    pass


#the order is taken advantage of here.
#no need to specifically state every property name
flightParams = FlightParameters(
    folder_path.get(),ship1.get(),flight_number.get(),flight_date.get(),test_number.get(),mission_number.get(),pilot1.get(),tc1.get(),ops1.get(),mission_type.get(),etd1.get(),eta1.get(),sw1.get(),var1.get(),var2.get(),var3.get(),var4.get(),var5.get(),var6.get(),var7.get(),var8.get(),var9.get(),)

#treated like a property instead of a key
print(flightParams.folderPath)

#easily converted to dict
flightParamsDict = asdict(flightParams)

或者,由于上述内容的组织方式,您也可以按照以下步骤进行操作。

base = BaseSpecs(
    folder_path.get(),)

mission = MissionSpecs(
    mission_number.get(),)

flight = FlightSpecs(
    var1.get(),)

flightParams = FlightParameters(**asdict(base),**asdict(mission),**asdict(flight))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。