让循环把东西插进风中

2024-09-27 00:22:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Tkinter程序,它必须向窗口添加大量的数据,所以我试图写一个for循环来处理它,但是由于我必须使用一个字符串变量作为Tkinter正在运行的对象的名称。insert()在对象上。我没解释清楚,这是方法

def fillWindow(self):
        global fileDirectory
        location = os.path.join(fileDirectory, family + '.txt')
        file = open(location, 'r')

        ordersDict = {}
        for line in file:
            (key, value) = line.split(':', 1)
            ordersDict[key] = value

        for key in ordersDict:
            ordersDict[key] = ordersDict[key][:-2]

        for item in ordersDict:
            if item[0] == '#':
                if item[1] == 'o':
                    name = 'ordered%s' %item[2:]

right here is the problem line because I have the variable that matches the name of the entry object already created but 'name' is actually a string variable so it gives me the error "AttributeError: 'str' object has no attribute 'insert'"

^{pr2}$

这是全班同学。它创建了一个Tkinter窗口,并用一种装运屏幕填充它,这样所有的条目都是关于某件事情需要多少个订单的。我也很新,所以我知道我做的事情很多。

class EditShippingWindow(Tkinter.Toplevel):

def __init__(self, student):

    Tkinter.Toplevel.__init__(self)
    self.title('Orders')

    family = student

    ## Window Filling

    ageGroupLabel = Tkinter.Label(self,text='Age Group')
    ageGroupLabel.grid(row=0,column=0)

    itemColumnLabel = Tkinter.Label(self,text='Item')
    itemColumnLabel.grid(row=0, column=1)

    costColumnLabel = Tkinter.Label(self,text='Cost')
    costColumnLabel.grid(row=0, column=2)

    orderedColumnLabel = Tkinter.Label(self,text='Ordered')
    orderedColumnLabel.grid(row=0, column=3)

    paidColumnLabel = Tkinter.Label(self,text='Paid')
    paidColumnLabel.grid(row=0, column=4)

    receivedColumnLabel = Tkinter.Label(self,text='Received')
    receivedColumnLabel.grid(row=0, column=5)



    #Item Filling

    column1list = ['T-Shirt (2T):$9.00', 'T-Shirt (3T):$9.00', 'T-Shirt (4T):$9.00',
                   'Praise Music CD:$10.00', ':', 'Vest L(Size 6):$10.00', 'Vest XL(Size 8):$10.00', 
                   'Hand Book (KJ/NIV):$8.75', 'Handbook Bag:$6.00', 'Memory CD (KJ/NIV):$10.00',
                   ':', 'Vest L(size 10):$10.00', 'Vest XL(Size 12):$10.00', 'Hand Glider (KJ/NIV/NKJ):$10.00',
                    'Wing Runner (KJ/NIV/NKJ):$10.00', 'Sky Stormer (KJ/NIV/NKJ):$10.00', 'Handbook Bag:$5.00',
                    'Memory CD (S/H/C):$10.00', 'Hand Glider Freq. Flyer:$8.00', 'Wing Runner Freq. Flyer:$8.00',
                    'Sky Stormer Handbook:$8.00' , ':', 'Uniform T-Shirt Size (10/12/14):$13.00',
                      'Uniform T-Shirt Size(10/12/14):$13.00', 'Uniform T-Shirt(Adult S / M / L / XL):$13.00',
                     '3rd & 4th Gr. Book 1 (KJ / NIV / NKJ):$8.75', '3rd & 4th Gr. Book 2 (KJ / NIV / NKJ):$8.75',
                     '4th & 5th Gr. Book 1 (KJ / NIV / NKJ):$8.75', '4th & 5th Gr. Book 2 (KJ / NIV / NKJ):$8.75',
                     'Memory CD 3rd & 4th Gr. Book (1/2):$10.00', 'Drawstring Backpack:$5.50']
    column1num = 1
    for item in column1list:
        num = str(column1num)

        (title, price) = item.split(':')

        objectName1 = 'column1row' + num
        objectName1 = Tkinter.Label(self,text=title)
        objectName1.grid(row=column1num, column=1)

        objectName2 = 'column1row' + num
        objectName2 = Tkinter.Label(self,text=price)
        objectName2.grid(row=column1num, column=2)
        column1num += 1

    #Ordered Paid Recieved Filler

    for i in range(32):
        if  i == 11 or i == 22 or i == 0 or i == 5:
            pass
        else:
            width = 10
            # First Column
            title1 = 'ordered' + str(i)
            self.title1 = Tkinter.Entry(self,width=width)
            self.title1.grid(row=i,column=3)
            #self.title1.insert(0, title1)

            #Second
            title2 = 'paid' + str(i)
            self.title2 = Tkinter.Entry(self,width=width)
            self.title2.grid(row=i,column=4)
            #self.title2.insert(0, title2)

            #Third
            title3 = 'received' + str(i)
            self.title3 = Tkinter.Entry(self,width=width)
            self.title3.grid(row=i,column=5)
            #self.title3.insert(0, title3)






    ## Methods

    def fillWindow(self):
        global fileDirectory
        location = os.path.join(fileDirectory, family + '.txt')
        file = open(location, 'r')

        ordersDict = {}
        for line in file:
            (key, value) = line.split(':', 1)
            ordersDict[key] = value

        for key in ordersDict:
            ordersDict[key] = ordersDict[key][:-2]

        for item in ordersDict:
            if item[0] == '#':
                if item[1] == 'o':
                    self.name = 'ordered%s' %item[2:]

                    self.name.insert(0,ordersDict[item])



    fillWindow(self)

Tags: keytextinselffortkintercolumnitem
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:41

这里看起来有一个概念错误:在这个方法中,变量“name”直到第一个列表的最后一行都不存在。然后创建它,并指向一个普通的Python字符串,如果您在类的其他地方使用一个“name”变量,该变量在该方法中不存在。在

要轻松修复现有代码,请尝试将变量调用为“自身名称“而不仅仅是命名它的创建位置,并在该方法的最后一行使用: self.name.insert(0,ordersDict[item])而不是。在

self.前缀将把变量转换为实例变量,实例变量在类的同一实例上的方法之间共享。在

另一方面,您甚至不需要字典,更不用说在这个方法上连续三个for循环,只需在文本变量中插入从“line”提取的相关值。在

相关问题 更多 >

    热门问题