2013-05-04 11 views
7

私はちょうどその時点でtkinterを学び始めています。メッセージボックスをインポートするとき、私はimport文を実際に理解してはいけないということを発見しました。私を混乱させるtk messagebox import confusion

事はつまり:

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のmessageboxtkMessageBoxと呼ばれ、tkinterで定義されていないと思いました。

+0

+1(tkinter3に触れていないもののために)良いパズルゲームを試してみてください。 – msw

答えて

15

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` 
+0

O.k、意味があります。ちょっと小さな質問ですが、 'messagebox'を' tkinter .__ init __。py'に手動で入れても問題はないでしょうか?私は開発者が何らかの理由でそれをしなかったと仮定します。 – Apple

+1

他のパッケージのファイルを変更することはお勧めできません。そのコードが変更されずに実行されず、他のマシンを破壊したり、依存関係が更新されたりすることもありません。必要なものだけをインポートする必要があります。 – mata

+2

問題は、あなたのコードが他の_インタープリターと互換性がないことです。ライブラリを分割する理由がありました。おそらく豊富なPython開発ノートのどこかに書かれています。 – msw

0

この

import sys 

from tkinter import * 

...とあなたのコード