Nano Hash - криптовалюты, майнинг, программирование

Координаты Button_Press_Event вызываются до того, как я фактически нажму

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

Моя проблема в том, что переменная, которую я объявляю для хранения координат x, y моего клика («координаты»), кажется, вызывается до того, как я на самом деле щелкну, что приводит к пустому массиву и ошибкам.

Коллега прислал его мне много месяцев назад, и когда-то он работал безупречно. Но, похоже, он перестал работать. Это может быть результатом обновления некоторых библиотек/модулей, но я не уверен.

Я пробовал различные комбинации, в том числе объявлял «координаты» в другой функции, в других местах и ​​т. д. Я пытался изменить порядок определенных строк, чтобы, возможно, вызвать «координаты» позже. Я также пытался писать код с нуля, и у меня было много таких же ошибок. Поскольку этот конкретный код когда-то работал, я прикрепляю его вместо своих попыток.

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

def plot_image(file, vmin=5, vmax=99, threshold=5, radius=25):

    hdu=fits.open(file)
    image = hdu[0].data
    exptime = hdu[0].header['EXPTIME']
    band = hdu[0].header['FILTERS']
    airmass = hdu[0].header['AIRMASS']
    readnoise = hdu[0].header['RN_01']
    gain = hdu[0].header['GAIN_01']
    obj = hdu[0].header['OBJECT']

    sub = image[1500:2000,1500:2000]

    bkg_sigma = mad_std(sub)

    mean, median, std = sigma_clipped_stats(sub, sigma=3.0, maxiters=5)

    daofind = photutils.DAOStarFinder(fwhm=2., threshold=threshold*bkg_sigma)  
    sources = daofind(sub - median) 

    positions = (sources['xcentroid'], sources['ycentroid'])
    apertures = photutils.CircularAperture(positions, r=radius)
    phot_table = photutils.aperture_photometry(sub - median, apertures)

    pix = select(image, apertures)
    print(pix)

    if len(pix) == 2 or len(coords) == 2:
        distance = np.sqrt((np.array(phot_table['xcenter'])-pix[0])**2 + (np.array(phot_table['ycenter'])-pix[1])**2)
        star = np.argmin(dist)
        counts = phot_table[star]['aperture_sum']
        fluxfile = open('testfile.txt')

        signal = (counts * gain) / exptime
        err = np.sqrt(counts*gain + (readnoise**2*np.pi*radius**2))
    else:
        print('Pix length = 0')

def select(image, apertures, vmin = 5, vmax = 99):

    global coords
    coords = []

    fig = plt.figure(figsize = (9,9))
    ax = fig.add_subplot(111)

    ax.imshow(image, cmap  = 'gist_gray_r', origin='lower', vmin = np.percentile(image, vmin), vmax = np.percentile(image, vmax), interpolation='none')
    apertures.plot(color='blue', lw=1.5, alpha=0.5, ax = ax)
    ax.set_title('Hello')#label='Object: '+obj+'\nFilter: '+band)

    cid = fig.canvas.mpl_connect('button_press_event', onclick)

    plt.show()  

    fig.canvas.mpl_disconnect(cid)
    if None in coords:
        return [np.nan,np.nan]
    else:
        return np.round(coords)

def onclick(event):

    x = event.xdata
    y = event.ydata
    global coords
    coords = [x, y]

    plt.close()
    return 

def closeonclick(event):
    print('Close On Click')
    plt.close()
    return

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

Фактический результат: немедленно печатаются "координаты" (пустой список). Сразу после этого отображается изображение. Нажатие на нее ничего не дает. Это не меняет значение «координаты», больше ничего не печатается и окно не закрывается.


Ответы:


1

Я вернусь и удалю это, если это неправильно (я бы прокомментировал, если бы у меня была репутация), но похоже, что вам нужно сначала определить глобальную переменную вне каких-либо функций, а затем использовать ключевое слово перед именем переменной внутри функции, чтобы изменить область ее действия. Попробуйте переместить «coords = []» за пределы ваших функций (список больше не будет пустым после первого вызова «onclick», но каждый новый щелчок должен заменять координаты, поэтому это не должно быть проблемой).

Ссылка: https://www.programiz.com/python-programming/global-keyword< /а>

01.10.2019
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..