【问题标题】:tk messagebox import confusiontk 消息框导入混乱
【发布时间】:2013-04-28 19:02:40
【问题描述】:

我现在刚开始学习tkinter,在导入messagebox的时候发现一定不是很懂import语句。

让我困惑的是:

import tkinter as tk

def text_box():
    if tk.messagebox.askokcancel("Quit", "Never Mind"):
        root.destroy()

root = tk.Tk()
button = tk.Button(root, text="Press the button", command=text_box)
button.pack()
root.mainloop()

编译正常,但按下按钮会出现错误'module' object has no attribute 'messagebox',而代码:

import tkinter as tk
from tkinter import messagebox

...
    if messagebox.askokcancel("Quit", "Never Mind"):
...

...工作顺利。

如果我使用 from tkinter import * 导入,我会收到类似的错误。

tkinter 的帮助在PACKAGE CONTENTS 的列表中显示messagebox,但我就是无法正常加载。

所以我的问题是,为什么......以及我不明白的导入是什么?

我想我应该提一下——该代码仅适用于 Python 3,而在 Python 2.x 中,messagebox 被称为 tkMessageBox,并且未在 tkinter 中定义。

【问题讨论】:

  • +1 一个很好的益智游戏(对于没有接触过 tkinter3 的人)。

标签: python python-3.x tkinter import


【解决方案1】:

试试这个

import sys

from tkinter import *

...和你的代码

【讨论】:

    【解决方案2】:

    tkinter.messagebox 是一个模块,而不是一个类。

    由于它没有在 tkinter.__init__.py 中导入,因此您必须明确地导入它才能使用它。

    import tkinter
    tkinter.messagebox  # would raise an ImportError
    from tkinter import messagebox
    tkinter.messagebox  # now it's available eiter as `messagebox` or `tkinter.messagebox`
    

    【讨论】:

    • 好吧,这是有道理的。只是一个小问题,手动将messagebox 放入tkinter.__init__.py 是否有任何问题?我认为开发人员没有这样做是有原因的。
    • 更改其他包中的文件不是一个好主意。如果没有这些修改,您的代码将无法在其他机器上运行或在更新依赖项时中断。你应该简单地导入你需要的东西。
    • 问题在于您的代码与其他所有解释器不兼容。划分库是有原因的,这可能记录在丰富的 Python 开发说明中的某处。
    • 谢谢,只制作了本地程序,没想到。
    • 我更喜欢from tkinter import messagebox as tkMessageBox,因为除了生成的非限定名称稍微短一点之外,这也是许多 Python 2 脚本尊重它的方式。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2021-08-04
    • 2018-08-26
    相关资源
    最近更新 更多