#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. Возможно, лучшим решением будет написать мою собственную процедуру поперечного сечения. Я думал сэкономить время. Спасибо за ваши предложения.