Tkinter: AttributeError: объект NoneType не имеет никакого атрибута <название атрибута>

Определение в сообщении в блоге, должен иметь конкретный (установка (& блок), метод определяется в модуле Thoughtbot:: Должен иметь в context.rb., должен have.rb затем сделать, чтобы TestCase расширил тот модуль).

определение для чистого теста:: единица

# File test/unit/testcase.rb, line 100
      def setup
      end

, что Вы могли сделать,

def setup
  log_test
end  

private   

def log_test   
  if Rails::logger  
    # When I run tests in rake or autotest I see the same log message multiple times per test for some reason.   
    # This guard prevents that.   
  unless @already_logged_this_test  
    Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"  
  end  
  @already_logged_this_test = true  
end 
<час>

редактирование

, если Вы действительно не хотите редактировать свои файлы, можно рискнуть вновь открыть тестовый сценарий и расшириться выполненный вместо этого:

class Test::Unit::TestCase   
  alias :old_run :run
  def run 
    log_test
    old_run
  end
end

это должно работать (у меня нет рубина вокруг для тестирования, хотя)

<час>

я сдаюсь! (в разочаровании)

я проверил, что код и направляющие на самом деле делают волшебство позади сцены, которая является, вероятно, почему переопределение выполнения не работает.

вещь: часть волшебства включает ActiveSupport:: CallBack и обратные вызовы создания для установки и разрушения.

то, что означает

class Test::Unit::TestCase
  setup :log_test  

  private   

  def log_test   
    if Rails::logger  
      # When I run tests in rake or autotest I see the same log message multiple times per test for some reason.   
      # This guard prevents that.   
      unless @already_logged_this_test  
        Rails::logger.info "\n\nStarting #{@method_name}\n#{'-' * (9 + @method_name.length)}\n"  
      end  
      @already_logged_this_test = true  
    end  
  end  
end

, должно определенно работать

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

38
задан Bryan Oakley 13 June 2019 в 18:34
поделиться

2 ответа

Сетка , pack и место ] функции объекта Entry и всех других виджетов возвращают None . В python, когда вы выполняете a (). B () , результатом выражения будет то, что возвращает b () , поэтому Entry (...). Grid ( ...) вернет Нет .

Вы должны разделить это на две строки следующим образом:

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)

Таким образом вы получите ссылку на Entry , хранящуюся в entryBox , и она будет размещена так, как вы ожидаете. У этого есть дополнительный побочный эффект, заключающийся в упрощении понимания и поддержки вашего макета, если вы собираете все операторы grid и / или pack в блоки.

77
ответ дан 27 November 2019 в 03:26
поделиться

Измените эту строку:

entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W)

на эти две строки:

entryBox=Entry(root,width=60)
entryBox.grid(row=2, column=1,sticky=W)

Точно так же, как вы уже правильно сделали для grabBtn !

5
ответ дан 27 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: