NameError: 全局名称 'ImageDraw' 未定义

2 投票
1 回答
9455 浏览
提问于 2025-04-18 03:42

我刚入门,大家好所以这个社区

我正在使用Pillow库进行开发,还用到了(Tkinter、BmpImagePlugin、cStringIO、subprocess、ctypes、re等)模块

当出现这种情况时,我会遇到AttributeError错误

from PIL import *

我用try-except来解决这行代码的问题

try:
    from PIL import *
except AttributeError: #module has no attribute ImageN
    import Image
    import ImageDraw
    import ImageFont

我原来的代码部分

class capsGen(object):
    def __init__(self):
        pass

    def videoGen(self,path):
        iv = InputVideoStream()
        iv.open(path)
        self.videoHead(path)
        print self.topDuration
        frameDiff = list(enumerate(iv.readframe())) #bmp -> [io][1]
        self.totalFrame = frameDiff[-1][0]
        #16 imgs
        self.genImgs = []
        curImg = 0
        while True:
            if curImg < 16:
                self.genImgs.append(randint(1,self.totalFrame))
                curImg = curImg + 1 
            else:
                break


        try:
            src = PIL.Image.open("src.png")
            ciz = PIL.ImageDraw.draw(src)
            ft = PIL.ImageFont.truetype("arial.ttf",32)
            ciz.text((190,15),self.fileName,font=ft) #fileName
            src.save("1.png")


            #print frameDiff[5][0]
            for i in self.genImgs:
                imj = PIL.Image.open(StringIO.StringIO(frameDiff[i][1])) #base io -> [capsNo][1]
                imj.save("%s.png"%i)
        except NameError:
            src = Image.open("src.png")
            ciz = ImageDraw.draw(src)
            ft = ImageFont.truetype("arial.ttf",32)
            ciz.text((190,15),self.fileName,font=ft) #fileName
            src.save("1.png")


            #print frameDiff[5][0]
            for i in self.genImgs:
                imj = Image.open(StringIO.StringIO(frameDiff[i][1])) #base -> [io][1]
                imj.save("%s.png"%i)

我的错误是,

Traceback (most recent call last):
  File "o.py", line 275, in (module)
    run = capsGen()
  File "o.py", line 42, in __init__
    self.videoGen() #for developers
  File "o.py", line 157, in videoGen
    ciz = ImageDraw.draw(src)
NameError: global name 'ImageDraw' is not defined

但是我已经安装了Pillow模块,并且在导入PIL或Image等模块时创建了一个空的Python文件,它们都能正常工作。只是它在我的项目(o.py)中不工作

谢谢大家的关注。祝大家工作顺利。

1 个回答

2

你提到了“Tkinter”模块。

如果你要导入Tkinter模块,可以这样做:

from Tkinter import *

一般来说,程序员都是这么使用的。

而且使用PIL模块时,我们必须知道每个模块的类名,因为它们可能会有冲突。

Tkinter和PIL都在Image模块里。它们的.open属性几乎是一样的。

解决方法:

import Tkinter as tk

无论你是否使用Pillow,我建议你这样做:

from PIL import Image, ImageDraw, ImageFont

最后,你应该使用字符串名称来引用,比如:

class tryAgain(object):
    def __init__(self):
        self.referenceName = "Hell" + "o"

    def run(self):
        img = Image.open(self.referenceName)
        #this like

撰写回答