【问题标题】:Import an Error class from a package in python从python中的包中导入错误类
【发布时间】:2018-01-04 17:40:57
【问题描述】:

如何在 python 中导入 Error 类(并且只有错误类,而不是命名空间)以用于异常处理?

不打算使用的内容:

from tkinter import _tkinter as tk

try:
    ...
except tk.TclError:
    print('Oops. Bad window path.')

我已经尝试了上述方法,但这样做也会将一堆其他我不需要的东西导入我的命名空间,我还需要使用 tk.TclError 来引用它,而不是简单的 TclError。

我尽量避免,因为它导入了我不需要的整个包,我只需要处理异常:

import tkinter as tk

try:
    ...
except tk.TclError:
    print('Oops. Bad window path.')

那么我如何从包中单独导入 Error 类,不获取整个 tkinter 命名空间,如果这是可能的或可推荐的?

我有两个独立的程序,这里我将它们称为 A 和 B 以缩短它。

我想要达到的目标

A.py

## Communicator ##
import B

#... Some irrelevant code ...
GUI = B.start()

try:
    #Tell the GUI to modify something, for example:
    GUI.entry.insert(0, 'Input')
except TclError:
    #Modification failed due to Bad Window Path

B.py

## GUI ##
import tkinter as tk

#Little Function to give the Communicator the required object to start/handle the GUI
def start():
    root = tk.Tk()
    run = Alarmviewer(root)
    return run

#... GUI initialization, creating/destroying of windows, modifications, etc

【问题讨论】:

  • 你为什么要导入_tkinter?这不是为 tkinter 包以外的其他人设计的。为什么一定要用tk.TclError?这没有多大意义。您能解释一下您要解决的更大的问题是什么吗?
  • 好的。一点澄清。提到的 .py 我收到错误没有导入 tkinter,这是需要的,因为有一个单独的 .py 可以处理 GUI 元素。但是,由于我仍然需要以某种方式告诉 GUI 元素进行修改,因此有时会在所述 GUI 元素不存在时出现 TclError。
  • 很抱歉,但这没有多大意义。我不明白为什么不能在需要捕获 TclError 的任何代码中导入 tkinter。你能提供一个minimal reproducible example吗?
  • 您似乎试图将您的 GUI 代码和非 GUI 代码分开,并且非 GUI 代码需要捕获与 GUI 相关的错误。那是对的吗?为什么不让您的非 GUI 代码从您的 GUI 代码中导入 TclError?让你自己的 GUI 代码导出它。

标签: python-3.x exception tkinter


【解决方案1】:

TclError 类可以从 tkinter 导入。要将其作为tk.TclError 使用,只需导入名称为tktkinter

import tkinter as tk
try:
    ...
except tk.TclError:
    ...

当然,如果您愿意,您可以只导入 TclError 异常,尽管在这个特定示例中它确实是 doesn't have any actual advantage 而不是导入整个模块:

from tkinter import TclError
try:
    ...
except TclError:
    ...

您的问题声称您必须将其引用为tk.TclError,但这是一个错误的陈述。您通过导入它的名称来引用它。名称无关紧要,重要的是实际的异常对象本身。

例如,创建一个名为 gui.py 的文件,然后在该文件中放入:

# gui.py
import tkinter as tk
def do_something():
    raise tk.TclError("something bad happened")

接下来,在另一个文件中添加以下代码:

from tkinter import TclError
import gui

try:
    gui.do_something()
except TclError:
    print("I caught the TclError")

当您运行代码时,您应该会看到打印的“我发现了 TclError”。

【讨论】:

  • 是的,也可以,但不是我想要的。我在上面澄清了。
  • @HackXIt:我试图添加说明。我认为您对导入和异常的工作方式有一点误解。
  • 哦,很奇怪...我可能没有必要问这个问题,因为起初尝试 from tkinter import TclError 没有用。莫名的误会。提供的关于我实际上并没有从中受益这一事实的链接也有帮助,谢谢!但是为了更好的阅读,我还是更喜欢使用from tkinter import TclError,因为它已经表明我除了A.py中的TclError之外不使用其他任何东西
  • 从 GUI 代码中导出 TclError 效果也很好,甚至可能会更好,因为这样我就不需要在我的非 GUI 代码中导入任何与 GUI 相关的东西。大获成功!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2010-10-09
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多