2010-09-07 1 views
1

Я очень новичок в Python, вроде следующего погружения в Python 2 и хотел поработать с некоторым программированием Tkinter. Я попытался сделать небольшую программу, которая принимает 3 набора слов и делает комбинацию каждого слова в 3 наборах для создания ключевых слов для веб-сайтов. Когда я запускаю сценарий, графический интерфейс выглядит как ожидалось, но я получаю следующее сообщение об ошибке, когда я нажимаю на кнопку Создать комбинацииОшибка метода Python Tkinter Text Widget .get

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in __call__ 
    return self.func(*args) 
    File "combomaker.py", line 34, in makeCombinations 
    primaryraw = primaryKeyWordsBox.get() 
AttributeError: 'NoneType' object has no attribute 'get' 

код я пытаюсь исправить

#!/usr/bin/env python 
from Tkinter import * 

primaryKeyWordsLabel = None 
primaryKeyWordsBox = None 
secondaryKeyWordsLabel = None 
secondaryKeyWordsBox = None 
tertiaryKeyWordsLabel = None 
tertiaryKeyWordsBox = None 

class Application(Frame): 
def __init__(self, master=None, padx = 10, pady= 10): 
    Frame.__init__(self, master) 
    self.grid() 
    self.createWidgets() 

def createWidgets(self): 
    self.primaryKeyWordsLabel = LabelFrame(text="Primary Key Words", padx=10, pady=10) 
    self.primaryKeyWordsLabel.grid() 
    self.primaryKeyWordsBox = Text(primaryKeyWordsLabel, autoseparators=True, height=5, undo=True) 
    self.primaryKeyWordsBox.grid() 
    self.secondaryKeyWordsLabel = LabelFrame(text="Secondary Key Words", padx=10, pady=10) 
    self.secondaryKeyWordsLabel.grid() 
    self.secondaryKeyWordsBox = Text(secondaryKeyWordsLabel, autoseparators=True, height=5, undo=True) 
    self.secondaryKeyWordsBox.grid() 
    self.tertiaryKeyWordsLabel = LabelFrame(text="Tertiary Key Words", padx=10, pady=10) 
    self.tertiaryKeyWordsLabel.grid() 
    self.tertiaryKeyWordsBox = Text(tertiaryKeyWordsLabel, autoseparators=True, height=5, undo=True) 
    self.tertiaryKeyWordsBox.grid() 
    self.goButton = Button(text="Create Combinations", command=makeCombinations) 
    self.goButton.grid() 

def makeCombinations(): 
    primaryraw = primaryKeyWordsBox.get() 
    primary = primaryraw.split(', ') 
    secondaryraw = secondaryKeyWordsBox.get() 
    secondary = secondaryraw.split(', ') 
    tertiaryraw = tertiaryKeyWordsBox.get() 
    tertiary = tertiaryraw.split(', ') 
    output=[] 
    filename = "output.txt" 
    for i in range(len(primary)): 
    for j in range(len(secondary)): 
    for k in range(len(tertiary)): 
    rawcombo=str(primary[i])+" "+str(secondary[j])+" "+str(tertiary[k]) 
    output.append(rawcombo) 
    FILE = open(filename, w) 
    for combo in output: 
    FILE.write(combo+",\n") 
    FILE.close() 
app = Application()      
app.master.title("Keyword Generator") 
app.mainloop()  

я могу слишком быстро влились в программирование графического интерфейса, это моя первая попытка работы с графическим интерфейсом, но не мое первое программирование.
Большое спасибо заранее :)

ответ

1

Вы пытаетесь получить доступ к

primaryKeyWordsBox 

вне класса Application в (бесплатно) функции makeCombinations(..).

Вы могли бы сделать makeCombinations(..) членом Application углубленными его, как и другие функции-члены и добавить self аргумент:

def makeCombinations(self): 

Вы должны изменить связывание makeCombinations(..) с кнопкой:

...,command = self.makeCombinations) 

Затем вам нужно будет добавить self., когда вы пытаетесь получить доступ к членам этого класса:

primaryraw = self.primaryKeyWordsBox.get(1.0,END) 
... 
secondaryraw = self.secondaryKeyWordsBox.get(1.0,END) 
... 
tertiaryraw = self.tertiaryKeyWordsBox.get(1.0,END) 

(Я нашел примеры, как использовать gethere).

Если вы хотите открыть файл для записи, вы должны сделать:

FILE = open(filename, "w") 

вместо

FILE = open(filename, w) 
+0

Спасибо Андре Хольцнер, что это фиксированная моя проблема совершенно. Я очень рад, что у меня есть рабочее графическое приложение сейчас, хотя и простое :) –