цикл, чтобы вставить вещи в окно tkinter - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть программа 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:]

прямо здесь - строка проблемы, потому что у меня есть переменная, которая соответствует имени уже созданного объекта ввода, но 'name'на самом деле это строковая переменная, поэтому она выдаёт мне ошибку «AttributeError: у объекта 'str' нет атрибута 'insert'"

                    name.insert(0,ordersDict[item])

, вот весь классОн создает окно 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)

1 Ответ

1 голос
/ 11 апреля 2011

Похоже, у вас есть концептуальная ошибка: внутри этого метода переменная "name" не существует до последней строки в первом листинге. Затем он создается и указывает на обычную строку Python - если вы используете переменную «name» в другом месте вашего класса, эта переменная не существует внутри этого метода.

Чтобы легко исправить существующий код, попробуйте вызвать переменную как «self.name», а не просто имя, где она была создана, и в последней строке этого метода используйте: self.name.insert(0,ordersDict[item]) вместо.

Префикс self. превратит вашу переменную в переменную экземпляра, которая используется всеми методами одного экземпляра класса.

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

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