Исключение в обратном вызове Tkinter, которое возникает только при пакетном запуске, а не при запуске Spyder

#tkinter #callback #spyder

#tkinter #обратный вызов #spyder

Вопрос:

Я написал код, который отображает результаты динамического 3D-моделирования. Один из вариантов — создать случайное поперечное сечение 3D-данных за определенное время. Я показываю определенный горизонтальный слайд, и можно прокручивать горизонтальные срезы на разную глубину. После этого пользователь может использовать мышь, чтобы указать точки, вдоль которых должно быть выполнено поперечное сечение. После этого строится поперечное сечение и сохраняется дата. После закрытия обеих фигур может быть создано новое случайное поперечное сечение.

Если я запускаю свой скрипт непосредственно из Spyder, все работает нормально. Однако, если я начну свой скрипт следующим образом:

 C:WPy64-3860python-3.8.6.amd64python.exe C:WPy64-3860script.py
 

Я получаю следующий код ошибки:

 Exception in Tkinter callback
Traceback (most recent call last):
  File "C:WPy64-3860python-3.8.6.amd64libtkinter__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:WPy64-3860Eigen_scriptshstout161220.py", line 768, in plot_and_save
    cross_sc=cross_section_linestring(da,profiel)
  File "C:WPy64-3860python-3.8.6.amd64libsite-packagesimodselectcross_sections.py", line 403, in cross_section_linestring
    return _cross_section(data, linecoords)
  File "C:WPy64-3860python-3.8.6.amd64libsite-packagesimodselectcross_sections.py", line 275, in _cross_section
    raise ValueError("Linestring does not intersect data")
ValueError: Linestring does not intersect data
 

Это фрагмент кода, в котором все идет не так:

     elif plane_id in ['User defined']:
        for ind2 in range(len(time_selection)):
            # Create the start point and end point for the cross section
            Y=np.flipud(np.rot90(Data_4D[:,:,:,time_selection[ind2]]))  #3D data 1 time for scroll slices
            Data_3Dt=Data_4D[:,:,:,time_selection[ind2]] #3D data 1 time for vert cross section

            class IndexTracker(object):
                def __init__(self, f1, Y):
                    self.f1 = f1
                    
                    self.Y = Y
                    rows, cols, self.slices = Y.shape
                    self.ind = self.slices// 2
                    
                    self.im = f1.contour(xcoord, ycoord, self.Y[:, :, self.ind])
                    self.update()
                    
                def onscroll(self, event):
                    print("%s %s" % (event.button, event.step))
                    if event.button == 'up':
                        self.ind = (self.ind   1) % self.slices
                    else:
                        self.ind = (self.ind - 1) % self.slices
                    self.update()
                            
                def update(self):
                    self.f1.clear()
                    self.f1.contour(xcoord, ycoord, self.Y[:, :, self.ind])
                    self.f1.grid(True)
                    self.f1.set_ylabel('Depth %s' % zcoord[self.ind])
                    self.im.axes.figure.canvas.draw()
                    
                def onclick(self,event):
                    fig.canvas.mpl_disconnect(cid)
            
            fig, f1 = plt.subplots(1, 1)   
            
            tracker = IndexTracker(f1, Y)
            fig.canvas.mpl_connect('scroll_event', tracker.onscroll) #update graph 
            
            xyprofiel = plt.ginput(n=0, show_clicks=True, mouse_add=1, mouse_pop=3, mouse_stop=2)
            #plt.show() 
        
            coords = {"x": xcoord, "y": ycoord, "z": zcoord}
            dims = ("x", "y", "z")
            da = xr.DataArray(Data_3Dt, coords, dims)
            profiel=sg.LineString(xyprofiel)
            
            cross_sc=cross_section_linestring(da,profiel)
            afstand=cross_sc.s
            diepte=cross_sc.z
            slice_data=cross_sc.values
            slice_data_rv=np.flipud(np.rot90(slice_data))
            #plt.close()
            
            fig2, f2 = plt.subplots(1,1)
            f2 = plt.contour(afstand,diepte, slice_data_rv)
            plt.grid(b=True, which='major', color='#666666', linestyle='-')
            f2.axes.set_aspect('equal')
            
            # plt.show()
            # prf = go.Figure(data = go.Contour(z=slice_data_rv, x=afstand, y=diepte))
            # prf.show()
            
            afstand, diepte =np.meshgrid(afstand, diepte)
            xx=afstand.flatten()
            yy=diepte.flatten()
            zz=slice_data_rv.flatten()
        
            np.savetxt(f'{dir_data}/random_slice_{selected_times_list[ind2]}Z_{Para}_{larfilename}.dat',np.c_[xx,yy,zz])
                               
            plt.show()
 

У кого-нибудь есть идеи, как это решить? Я, конечно, всегда могу запустить его из Spyder, но это не всегда удобно для меня.

Заранее спасибо, Ник

Комментарии:

1. Использует ли spyder ту же установку python, что и та, с которой вы пытаетесь запустить свой скрипт?

2. Да, это та же установка

3. Если подумать, возможно, это не так. Я использую Spyder версии 4.2.1, а версия Python — 3.8.2. Хотя это установка WinPython, которую я использую. У меня также установлена Anconda. Это еще не пробовал…

4. Затем проверьте, не является ли проблема в том, что вы используете разные версии библиотеки imod , и ваш код совместим только с одной из них (я ничего не знаю об этой библиотеке)

5. Я тоже не очень хорошо знаю эту библиотеку. Я просто взял его из Интернета из-за опции поперечного сечения. У меня было много проблем с этой библиотекой в Anconda. Это одна из причин, по которой я перешел на WinPy. Возможно, лучшим решением будет написать мою собственную процедуру поперечного сечения. Я думал сэкономить время. Спасибо за ваши предложения.