Python Tkinter Text Widget. Ошибка метода get - PullRequest
1 голос
/ 08 сентября 2010

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

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 Ответ

1 голос
/ 08 сентября 2010

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

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)

(я нашел примеры использования get здесь ).

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

 FILE = open(filename, "w")

вместо

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