определение затем () для Python пред2.6? (вместо object.next метода)

Когда я сначала изучал Java, мы должны были сделать Yahtzee, и я думал, что будет здорово создать пользовательские компоненты Swing и контейнеры вместо того, чтобы просто тянуть все на одном JPanel. Преимущество расширения Swing компоненты, конечно, должны иметь способность добавить поддержку сочетаний клавиш и других функций доступности, которые Вы не можете сделать только при наличии paint() печать метода симпатичное изображение. Это не может быть сделано лучший способ однако, но это может быть хорошая начальная точка для Вас.

Редактирование 8/6 - Если это не было очевидно из изображений, каждый Умирает, является кнопкой, которую можно нажать. Это переместит его в DiceContainer ниже. Рассмотрение исходного кода, Вы видите, что каждая кнопка Die оттянута динамично, на основе ее значения.

alt text
alt text
alt text

Вот основные шаги:

  1. Создают класс, который расширяется JComponent
  2. , Call порождает конструктора super() в Ваших конструкторах
  3. , Удостоверяются Вы реализации класса MouseListener
  4. Помещенный это в конструктора:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. Переопределение эти методы:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. Переопределение этот метод:

    public void paintComponent(Graphics g)
    

сумма пространства необходимо работать с тем, когда рисование кнопки определяется [1 110], принятие getMinimumSize() и getMaximumSize() возвращает то же значение. Я не экспериментировал слишком много с этим, но, в зависимости от расположения Вы используете для своего GUI, Ваша кнопка могла выглядеть полностью отличающейся.

И наконец, исходный код . В случае, если я пропустил что-либо.

5
задан behindthefall 11 November 2009 в 16:35
поделиться

3 ответа

class Throw(object): pass
throw = Throw() # easy sentinel hack
def next(iterator, default=throw):
  """next(iterator[, default])

  Return the next item from the iterator. If default is given
  and the iterator is exhausted, it is returned instead of
  raising StopIteration.
  """
  try:
    iternext = iterator.next.__call__
    # this way an AttributeError while executing next() isn't hidden
    # (2.6 does this too)
  except AttributeError:
    raise TypeError("%s object is not an iterator" % type(iterator).__name__)
  try:
    return iternext()
  except StopIteration:
    if default is throw:
      raise
    return default

( throw = object () тоже работает, но при проверке создаются более качественные документы, например help (next) . None не подходит, потому что вы должны относиться к next (it) и next (it, None) по-разному .)

11
ответ дан 18 December 2019 в 08:29
поделиться

Р. Кажется, у Пейта есть хороший ответ. Еще один звонок, который следует добавить: если вы пишете код для работы во многих различных версиях Python, вы можете условно определить определение:

try:
    next = next
except NameError:
    def next():
        # blah blah etc

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

Я использую next = next , чтобы я мог поместить это определение в модуль, а затем использовать в другом месте моего кода:

from backward import next
6
ответ дан 18 December 2019 в 08:29
поделиться

Simpler method:

import operator

next = operator.methodcaller("next")

Ned's suggestion about putting it in a try block works here as well, but if you're going to go that route, one minor note: in Python 3, calling next() on a non-iterator raises a TypeError, whereas this version would raise an AttributeError instead.

Edit: Never mind. As steveha points out, operator.methodcaller() was only introduced in 2.6, which is a shame.

2
ответ дан 18 December 2019 в 08:29
поделиться
Другие вопросы по тегам:

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