未定义全局名称“start”:Tkinter

时间:2014-02-06 03:30:31

标签: python tkinter

我从下面的代码段中收到错误“全局名称'开始'未定义”。但是displayImage(img)中的start(panel)调用会导致我想要看到的图像显示在GUI中;没有它没有图像出现;它必须做点什么。但我得到了上述错误。我在Ubuntu 12.04中运行这个程序。顺便说一句,我是Python和Tkinter的新手。有什么办法摆脱这个错误?编辑:在运行时通过单击按钮调用loadPicture(文件)来添加图像。

import numpy as np
from Tkinter import *
import cv2 as cv
from tkFileDialog import askopenfilename
import tkSimpleDialog as td
import math as mt
from PIL import ImageTk, Image


### General functions #############################################  

def raiseFileChooser():
    global filename
    filename = askopenfilename()
    loadPicture(filename)

def loadPicture(file):
# set global variable for other uses
    global img
    img = cv.imread(file, 1) 
    img = cv.cvtColor(img, cv.COLOR_RGB2BGR) 
    displayImage(img, display1)   

def displayImage(image, panel):
    temp = Image.fromarray(image)
    bk = ImageTk.PhotoImage(temp)
    bkLabel = Label(display1, image = bk)
    bkLabel.place(x=0, y=0, relwidth=1, relheight=1)
    start(panel)

### Start App ###########################################

#### get GUI started
root = Tk()
np.set_printoptions(threshold=np.nan)  # so I can print entire arrays

### global variables ####################################
relStatus = StringVar()
relStatus.set(None)
text = StringVar()
filepath = StringVar()
filename = "No file chosen"
img = None
gsc = None
eStatus = StringVar()
eStatus.set(None)
display1 = None
display2 = None

### GUI #################################################
root.title("Picture Transformer")
root.geometry("700x600")

app = PanedWindow(root)
app.pack(padx=20, pady=20)

#Button Panel##############
buttonPanel = Frame(app,width=200, height = 400)
buttonPanel.pack(side=LEFT)

chooser = Button(buttonPanel, text="Choose File", height=1, width=9, command=raiseFileChooser)
chooser.pack()

#set up display panels ###########################
display1 = Frame(app, width=900, height=900, bg="#cccccc")
display1.pack(side=LEFT, fill=BOTH, expand=1)

root.mainloop()

编辑: 堆栈跟踪:

Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
return self.func(*args)
File "hw2.py", line 78, in raiseFileChooser
loadPicture(filename)
File "hw2.py", line 86, in loadPicture
start(panel)
NameError: global name 'start' is not defined

3 个答案:

答案 0 :(得分:1)

错误告诉您到底出了什么问题 - 您的代码中没有全局start函数。事实上,就我所知,在你创建的任何对象中,任何地方都没有start方法。为什么你认为你应该调用名为start的函数?是否有某些文件告诉你这样做?

我的猜测是,你在IDLE中运行,当你调用不存在的start函数时,脚本会崩溃。当脚本崩溃时,它返回到IDLE,现在可以看到您创建到该点的任何窗口。

您的代码中最明显的问题是您没有创建根窗口。在脚本的早期某个地方,在创建StringVar的任何小部件或实例之前,您需要执行以下操作:

root = Tk()

答案 1 :(得分:-1)

尝试

panel.start()

只是一个猜测。试一试,你或许可以解决问题。

答案 2 :(得分:-1)

root.mainloop()在start()的位置工作。