Tkinter Python:関数で呼び出されたときにモジュールが見つかりませんか?

IntrepidArtisan

このエラーが発生するのはなぜですか。

File "exampleTreeCanvas.py", line 59, in treeImageSelect
    theImage = ImageTK.PhotoImage(Image.open(imageWhere)) #this line produces the error
NameError: name 'ImageTK' is not defined

次のコードを実行し、プログラムのTreeView(ファイルブラウザーとして使用しようとしている)で.pngファイルをクリックしてtreeImageSelect関数をトリガーするとどうなりますか?

import os
import glob
import tkinter
from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk

root = Tk()

def on_vertical(event):
    picCanvas.yview_scroll(-event.delta, 'units')

def on_horizontal(event):
    picCanvas.xview_scroll(-event.delta, 'units')

def populate_tree(tree, node):
    if tree.set(node, "type") != 'directory':
        return

    path = tree.set(node, "fullpath")
    tree.delete(*tree.get_children(node))

    parent = tree.parent(node)
    special_dirs = [] if parent else glob.glob('.') + glob.glob('..')

    for p in special_dirs + os.listdir(path):
        ptype = None
        p = os.path.join(path, p).replace('\\', '/')
        if os.path.isdir(p): ptype = "directory"
        elif os.path.isfile(p): ptype = "file"

        fname = os.path.split(p)[1]
        id = tree.insert(node, "end", text=fname, values=[p, ptype])

        if ptype == 'directory':
            if fname not in ('.', '..'):
                tree.insert(id, 0, text="dummy")
                tree.item(id, text=fname)
        elif ptype == 'file':
            size = os.stat(p).st_size
            tree.set(id, "size", "%d bytes" % size)

def populate_roots(tree):
    dir = os.path.abspath('.').replace('\\', '/')
    node = tree.insert('', 'end', text=dir, values=[dir, "directory"])
    populate_tree(tree, node)

def update_tree(event):
    tree = event.widget
    populate_tree(tree, tree.focus())

def treeImageSelect(event):
    if len(tree.selection()) == 1:
        filename, file_extension = os.path.splitext(tree.item(tree.selection()).get('values')[0])
        if file_extension == ".png":
            global imageWhere
            global theImage
            imageWhere = tree.item(tree.selection()).get('values')[0]
            theImage = ImageTK.PhotoImage(Image.open(imageWhere)) #this line produces the error
            picCanvas.itemconfigure(canvasImage, image = theImage)
            picCanvas.config(scrollregion=(0,0, theImage.width(), theImage.height()))

def autoscroll(sbar, first, last):
    """Hide and show scrollbar as needed."""
    first, last = float(first), float(last)
    if first <= 0 and last >= 1:
        sbar.grid_remove()
    else:
        sbar.grid()
    sbar.set(first, last)

contents = ttk.Frame(root, padding=(3,3,3,3), width=200, height=200)
treecontent = ttk.Frame(contents, padding=(3,3,3,3), width=200, height=200)
picFrame = ttk.Frame(contents, padding=(3,3,3,3), width=200, height=200)

hp = Scrollbar(picFrame, orient=HORIZONTAL)
vp = Scrollbar(picFrame, orient=VERTICAL)

picCanvas = Canvas(picFrame, scrollregion=(0, 0, 1000, 1000), yscrollcommand=vp.set, xscrollcommand=hp.set)

hp['command'] = picCanvas.xview
vp['command'] = picCanvas.yview

imageWhere = 'example.png'
theImage = ImageTk.PhotoImage(Image.open(imageWhere))
canvasImage = picCanvas.create_image(0,0,image=theImage, anchor='nw')
picCanvas.config(scrollregion=(0,0,theImage.width(), theImage.height()))

contents.grid(column=0, row=0, sticky=(N,S,W,E))
hp.grid(column=0, row=1, sticky=(W,E))
vp.grid(column=1, row=0, sticky=(N,S))
picFrame.grid(column=1, row=0, sticky=(N,S,E,W))
picCanvas.grid(column=0, row=0, sticky=(N,S,E,W))

tree = ttk.Treeview(treecontent, columns=("fullpath", "type", "size"), displaycolumns="size", yscrollcommand=lambda f, l: autoscroll(vsb, f, l), xscrollcommand=lambda f, l:autoscroll(hsb, f, l))
vsb = ttk.Scrollbar(treecontent, orient="vertical")
hsb = ttk.Scrollbar(treecontent, orient="horizontal")

vsb['command'] = tree.yview
hsb['command'] = tree.xview

tree.heading("#0", text="Directory Structure", anchor='w')
tree.heading("size", text="File Size", anchor='w')
tree.column("size", stretch=0, width=100)

populate_roots(tree)
tree.bind('<<TreeviewOpen>>', update_tree)
tree.bind('<<TreeviewSelect>>', treeImageSelect)

tree.grid(column=0, row=0, sticky='nswe')
vsb.grid(column=1, row=0, sticky='ns')
hsb.grid(column=0, row=1, sticky='ew')
treecontent.grid(column=0, row=0, rowspan=4, sticky='nesw')

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
contents.columnconfigure(0, weight=1)
contents.columnconfigure(1, weight=1)
contents.rowconfigure(0, weight=1)
treecontent.rowconfigure(0, weight=1)
treecontent.columnconfigure(0, weight=1)
picFrame.columnconfigure(0, weight=1)
picFrame.rowconfigure(0, weight=1)

picCanvas.bind('<MouseWheel>', on_vertical)
picCanvas.bind('<Shift-MouseWheel>', on_horizontal)

root.mainloop()

長いので申し訳ありませんが、壊さずに短くする方法がわかりませんでした。

さらに混乱させるために、この同様の(ただし短い)コードを実行しても、エラーはまったく発生しません。

from tkinter import *
import tkinter.ttk as ttk
from PIL import Image, ImageTk

def on_vertical(event):
    canvas.yview_scroll(-event.delta, 'units')

def on_horizontal(event):
    canvas.xview_scroll(-event.delta, 'units')

def getImage():
    global imageWhere
    theImage = ImageTk.PhotoImage(Image.open(imageWhere))
    return theImage

root = Tk()
h = Scrollbar(root, orient=HORIZONTAL)
v = Scrollbar(root, orient=VERTICAL)
canvas = Canvas(root, scrollregion=(0, 0, 1000, 1000), yscrollcommand=v.set, xscrollcommand=h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
imageWhere = 'example.png'
theImage = getImage()
canvas.create_image(0,0,image=theImage, anchor='nw')
canvas.grid(column=0, row=0, sticky=(N,W,E,S))

canvas.bind_all('<MouseWheel>', on_vertical)
canvas.bind_all('<Shift-MouseWheel>', on_horizontal)

h.grid(column=0, row=1, sticky=(W,E))
v.grid(column=1, row=0, sticky=(N,S))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.mainloop()

問題の原因は何ですか?treeViewによって呼び出される関数を除いて、どこでもImageTKを使用できるのはなぜですか?

背景:Python 3.4、Tkinter 8.5.18、Pillow(バージョンは不明)、およびMac OS X10.9.5を使用しています。ここでの考え方は、プログラムにCanvasの画像をユーザーがTreeviewで選択した.pngファイルに変更させることです。私はPythonとTkinterの両方で完全な初心者です。

ダニエルローズマン

タイプミスがImageTkありImageTKます。それは、ではありません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

cx_Freezeとtkinterを使用すると、「DLLの読み込みに失敗しました:指定されたモジュールが見つかりませんでした」というメッセージが表示されます。(Python 3.5.3)

分類Dev

別のモジュールで呼び出されたときにtkinterコンボボックス関数が機能しない

分類Dev

cx_freezeエラー:モジュールが見つかりませんtkinter

分類Dev

tkinterのエントリーウィジェットを終了するときに呼び出される関数はありますか?

分類Dev

別の関数が呼び出された場合、TkInterフレームはロードされません

分類Dev

コマンドラインから呼び出されたときにPythonモジュールが見つかりません

分類Dev

オブジェクト移動関数は、呼び出した後でも効果がありません:Tkinter

分類Dev

Tkinterインポートから* ImportError:「Tkinter」という名前のモジュールがありません

分類Dev

クラス tkinter から関数を呼び出せません

分類Dev

_tkinter TclError:パッケージTixが見つかりません

分類Dev

マウスが別のボタンの上にあるときに、tkinterで1つのボタンにバインドされた関数が呼び出されるのはなぜですか?

分類Dev

tkinter:pack()がクラスのinit関数の外部で呼び出されたときにラベルが表示されない

分類Dev

python、tkinterエントリが関数に到達します(エラーはボタンからの関数呼び出しにありました)

分類Dev

クラスが呼び出されたときにすべて実行される関数(tkinter)

分類Dev

1つのファイルで定義された関数が、他のファイルから呼び出したときに見つかりません

分類Dev

Python 3.6-AttributeError:モジュール 'tkinter'には属性 'filedialog'がありません

分類Dev

Tkinter:「after」関数はルートが破棄された後も呼び出されます

分類Dev

tkinterモジュールがコマンドライン経由で実行されたときに属性エラーを発生させるのに、IDLE経由で実行されたときに発生しないのはなぜですか?

分類Dev

再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

分類Dev

PhantomJSを介して呼び出すときに、モジュール「casper」が見つかりません

分類Dev

Tkinterを使用してPythonで別のファイルから関数にアクセスするにはどうすればよいですか。特定の問題の解決策が見つかりません

分類Dev

呼び出された関数のチェックボックスのさまざまなインスタンスごとに、Tkinterチェックボックスを含むループを機能させるにはどうすればよいですか?

分類Dev

Python 3で名前が変更されたtkinterモジュールはどれですか?

分類Dev

AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

分類Dev

コントローラの関数内で呼び出されたときにLaravelリクエストが見つかりません

分類Dev

GDB:ModuleNotFoundError:「_ tkinter」という名前のモジュールがありません

分類Dev

ImportError:tkinterという名前のモジュールがありません

分類Dev

_tkinter.TclError:パッケージTktableが見つかりません

分類Dev

呼び出されたときにカスタムTwigフィルターが見つかりません

Related 関連記事

  1. 1

    cx_Freezeとtkinterを使用すると、「DLLの読み込みに失敗しました:指定されたモジュールが見つかりませんでした」というメッセージが表示されます。(Python 3.5.3)

  2. 2

    別のモジュールで呼び出されたときにtkinterコンボボックス関数が機能しない

  3. 3

    cx_freezeエラー:モジュールが見つかりませんtkinter

  4. 4

    tkinterのエントリーウィジェットを終了するときに呼び出される関数はありますか?

  5. 5

    別の関数が呼び出された場合、TkInterフレームはロードされません

  6. 6

    コマンドラインから呼び出されたときにPythonモジュールが見つかりません

  7. 7

    オブジェクト移動関数は、呼び出した後でも効果がありません:Tkinter

  8. 8

    Tkinterインポートから* ImportError:「Tkinter」という名前のモジュールがありません

  9. 9

    クラス tkinter から関数を呼び出せません

  10. 10

    _tkinter TclError:パッケージTixが見つかりません

  11. 11

    マウスが別のボタンの上にあるときに、tkinterで1つのボタンにバインドされた関数が呼び出されるのはなぜですか?

  12. 12

    tkinter:pack()がクラスのinit関数の外部で呼び出されたときにラベルが表示されない

  13. 13

    python、tkinterエントリが関数に到達します(エラーはボタンからの関数呼び出しにありました)

  14. 14

    クラスが呼び出されたときにすべて実行される関数(tkinter)

  15. 15

    1つのファイルで定義された関数が、他のファイルから呼び出したときに見つかりません

  16. 16

    Python 3.6-AttributeError:モジュール 'tkinter'には属性 'filedialog'がありません

  17. 17

    Tkinter:「after」関数はルートが破棄された後も呼び出されます

  18. 18

    tkinterモジュールがコマンドライン経由で実行されたときに属性エラーを発生させるのに、IDLE経由で実行されたときに発生しないのはなぜですか?

  19. 19

    再帰的に呼び出されるtkinterウィジェットは2回しか表示されません

  20. 20

    PhantomJSを介して呼び出すときに、モジュール「casper」が見つかりません

  21. 21

    Tkinterを使用してPythonで別のファイルから関数にアクセスするにはどうすればよいですか。特定の問題の解決策が見つかりません

  22. 22

    呼び出された関数のチェックボックスのさまざまなインスタンスごとに、Tkinterチェックボックスを含むループを機能させるにはどうすればよいですか?

  23. 23

    Python 3で名前が変更されたtkinterモジュールはどれですか?

  24. 24

    AngularJs:子モジュールのディレクティブでリンクされた関数を呼び出すことができませんか?

  25. 25

    コントローラの関数内で呼び出されたときにLaravelリクエストが見つかりません

  26. 26

    GDB:ModuleNotFoundError:「_ tkinter」という名前のモジュールがありません

  27. 27

    ImportError:tkinterという名前のモジュールがありません

  28. 28

    _tkinter.TclError:パッケージTktableが見つかりません

  29. 29

    呼び出されたときにカスタムTwigフィルターが見つかりません

ホットタグ

アーカイブ