[tkinter]在非主线程中调用askstring()方法出错的解决方案

tkinter.simpledialog中的askstring()是个很方便的方法,str=askstring(root,title,prompt)就可以使用弹出信息窗口询问并获得字符串,大部分情况下它都工作得很好,但在多线程的情况下莫名的问题就来了:

  1. 弹出的窗口无法点击
  2. 抛出‘TclError: window ".34672232" was deleted before its visibility changed’错误

而且情况很严重,linux下3次有一次问题,win下几乎就是不可用的,本来挺好用的方法变得无比麻烦。

查看源码可发现,该方法最终的实现是通过创建一个Toplevel()窗口 (tkinter中一个窗口控件,虽然是一个独立窗口但又依赖于根窗口不能独立存在) 建立的对话框:

<pre class="brush: python;"> class Dialog(Toplevel): def __init__(self, parent, title = None): Toplevel.__init__(self, parent) </pre>

而在默认没有指定父控件的情况下会使用默认的根窗口进行初始化:

<pre class="brush: python;"> if not parent: parent = tkinter._default_root </pre>

既然在主线程的调用工作的很好,而子线程调用就出问题,很可能就是多线程冲突的问题,那解决办法就很简单了:将调用到主线程的东西(根窗口对象)改为new一个新的根窗口传给Toplevel,但同时由于这个新窗口我们其实并不想要看到它,所以还需要让它不可见,并且及时销毁:

<pre class="brush: python;"> t_root = tk.Tk() t_root.withdraw() str = askstring(parent=t_root, title='title', prompt="message") t_root.destroy() </pre>

测试可行,简单的方法又变得简单可靠了

转载于:https://my.oschina.net/yumenokanata/blog/385045

### 如何在 ArcGIS Pro 中进行语义分割 #### 工具与框架支持 ArcGIS Pro 提供了内置的支持来运行基于深度学习的语义分割任务。这主要依赖于安装和配置合适的深度学习框架,例如 TensorFlow 或 PyTorch[^1]。这些框架可以通过特定插件集成到 ArcGIS Pro 的环境中。 #### 数据准备 为了执行语义分割,需要准备好高质量的训练数据集。通常情况下,遥感图像会被裁剪成较小的片段以便于处理。例如,在科布县的一个案例研究中,一张高分辨率影像被切割成了多个 512×512 像素大小的小块,并进行了旋转增强操作以增加样本多样性[^2]。这种预处理方法有助于减少过拟合的风险并提高模型的泛化能力。 #### 导出训练数据 ArcGIS Pro 自带了一个名为 “Export Training Data For Deep Learning” 的地理处理工具,可以用来生成适合输入给神经网络使用的标注文件格式(如 COCO JSON 格式)。此过程会自动提取感兴趣对象(比如建筑物轮廓)对应的像素级真值信息作为掩码标签[^3]。 #### 模型构建与训练 一旦完成了上述准备工作,则可以选择流行的架构如 Mask R-CNN 或者 Deeplab V3+ 来搭建自己的语义分隔解决方案。Keras 是一种简单易用但功能强大的高级 API ,它允许快速原型设计以及高效实验不同的超参数组合。 #### 结果评估与部署 经过充分迭代优化后的最佳版本应该接受严格的测试验证其性能指标是否达到预期目标;之后可将其发布至生产环境当中去解决实际业务需求场景下的分类识别难题。 ```python import arcpy from arcgis.learn import prepare_data, SemanticSegmentation # 设置工作空间路径 workspace_path = r"C:\path\to\your\data" # 使用 ExportTrainingDataForDeepLearning 工具导出训练数据 arcpy.ExportTrainingDataForDeepLearning_management( in_raster=workspace_path + "\\input_image.tif", out_folder=workspace_path + "\\output_training_data" ) # 加载数据并初始化语义分割模型 data = prepare_data(workspace_path + "/output_training_data", chip_size=512) model = SemanticSegmentation(data) # 训练模型 model.fit(epochs=50) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值