gpt4 book ai didi

python - 两件事 : 1) Printing errors/tracebacks/exceptions to GUI and 2) The best way to utilize a script within a script

转载 作者:行者123 更新时间:2023-12-03 08:54:06 27 4
gpt4 key购买 nike

我一起问这些问题是因为我觉得他们在一起。做一个的方式影响我必须如何做另一个。我是计算机科学/编程/python 新手。

我有一个很长、很复杂的脚本,它不包含任何用户定义的函数。它接受输入并对其进行操作以形成输出。我用 Tkinter 构建了一个 GUI,供用户输入数据。我想在我的 GUI 主循环中运行我的脚本,并让脚本向 GUI 打印状态更新和错误。

GUI 打印错误 :我已经搜索并搜索了可能的解决方案,但我没有设法破解它。

Using a subprocess 看起来最有希望,但我相信子进程必须是 .exe 文件才能使其正常工作。我只有一个 Python 脚本,不知道如何将某些东西转换为可执行文件(但无论如何我需要尽快学习)。至于该页面上带有 sys 模块的第二个响应,我只是不明白“run_script”函数中发生了什么以将其应用于我自己的 GUI。

There's this "show error" solution 但我也不确定我是否真的理解这一点。这是否是说我需要将 Try...Except... 放在我的下标中的所有函数上并让它返回一个消息框?呸。我真的更喜欢像在命令结果/IDE中那样打印异常并退出命令。该页面上的回溯解决方案是否会是一种一次性的事情,我在我的 GUI 中声明过一次并让它适用于 GUI 中的所有功能?还是每次执行计算时都必须调用该 show_error 函数?

合并下标 :我意识到合并下标的方式会影响消息在 GUI 中的打印方式。我的下标 ( print "Loading modules..." ) 中有一堆打印语句,让用户知道程序正在运行。在继续之前,这是我正在使用的代码示例。

这是我的 GUI 代码的缩短版本:

import Tkinter

###____________Widgets__________________###
class InputBox(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self, parent)
self.parent = parent
self.initialize()

def initialize(self):
# Frame
self.OK = Tkinter.Frame(self, padx=3, pady=3)
self.OK.grid(column=2, row=2, columnspan=3, sticky="EW")

self.printFrame = Tkinter.LabelFrame(self, borderwidth=3, relief="ridge", padx=3, pady=3, text="Results")
self.printFrame.grid(column=0, row=3, columnspan=4, sticky="EW")

# Approval
self.OKbutton = Tkinter.Button(self.OK, text=u"OK", command=self.OKgo, anchor="e")
self.OKbutton.pack(side="right")

self.view = Tkinter.Text(self.printFrame)
self.view.grid(column=0, row=0, columnspan=3, sticky="EW")
self.scroll = Tkinter.Scrollbar(self.printFrame, orient=Tkinter.VERTICAL)
self.scroll.config(command=self.view.yview)
self.view.config(yscrollcommand=self.scroll.set)
self.scroll.grid(column=4, row=0, sticky="SN")

def OKgo(self):
# Load Inputs
DEMin = self.demEntryVar.get()
WTin = self.wtEntryVar.get()
soil = self.soilEntryVar.get()

这是我的“下标”的一小部分:
# Convert soils shapefile to raster and assign integer values to HSG.
# A=1, B=2, C=3, 4=D and dual groups A/D=14, B/D=24, C/D=34
# "---" is treated as a D soil
import arcpy
print("Converting dual group soils to single groups...")
SoilUnclass = arcpy.PolygonToRaster_conversion(soil, "HSG", ScratchPath + r"\SoilUnclass", "MAXIMUM_COMBINED_AREA")
SoilClass = arcpy.sa.Reclassify(SoilUnclass, "HSG", arcpy.sa.RemapValue([["A", 1],
["B", 2],
["C", 3],
["D", 4],
["A/D", 14],
["B/D", 24],
["C/D", 34],
["---", 4]]), "NODATA")
SoilClass.save(ScratchPath + r"\HSGras")

如果我将下标代码直接粘贴到 OKgo 函数中,我可以通过将所有打印语句更改为 self.view.insert("end", "Converting soils... \n") 来将其打印到 Text 小部件。据我了解,将我的整个下标粘贴到 OKgo 函数中是不可取的,因为它会卡住 GUI 并且通常很长。下标可能需要很长时间才能运行,所以这不是首选。

我还可以将我的下标分解为许多用户定义的函数,并在 OKgo 函数中单独调用它们,例如
import subscript as ss
ss.soilconvert(soil)

这对我来说会更干净、更容易诊断和执行 Try...Except... 事情,甚至认为它会卡住 GUI。但是,需要一个函数的输出作为下一个函数的输入,但我不知道如何调用它们。我也不知道如何将 print 语句转换为可以读入 Text 小部件的内容。

我也看到了一些关于 execfile 的东西,但我觉得将输出输入到 Text 小部件中更加困难。 :/我不知道任何编程约定,也不知道什么会更容易调试/更新。我需要一些方向,拜托。谢谢。

编辑:

我使用导入语句和 multiprocessing 版本创建了一个单线程版本。我做了这样的事情: Python multiprocessing redirect stdout of a child process to a Tkinter Text 捕获 stdout 并将其打印到 GUI。我仍在尝试使异常正常工作。以与重定向 sys.stderr 相同的方式重定向 sys.stdout 不起作用,但我还没有尝试 sys.excepthook 的事情。

最佳答案

您可以使用 sys.excepthook 捕获所有异常并显示它们。 : 只是
将其替换为您自己的功能,该功能将打开一个消息框
如果需要,错误回溯并退出:

import sys, traceback
def my_except_hook(type, value, traceback):
exception_string = "".join(traceback.format_exception(type, value, traceback))
# do whatever you want from here
print exception_string
sys.excepthook = my_except_hook

关于从 Python 脚本开始下标: execfile解决方案
可以,你可以通过替换默认来重定向stdout和stderr sys.stdoutsys.stderr ,但是使用 subprocess模块可能更适合避免损坏
主要的 Python 脚本。

关于python - 两件事 : 1) Printing errors/tracebacks/exceptions to GUI and 2) The best way to utilize a script within a script,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31814802/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com