2014-02-06 3 views
0

아래의 코드 조각에서 "전역 이름 'start'이 (가) 정의되지 않았습니다."오류가 발생합니다. 그러나 displayImage (img)의 start (panel) 호출은보고자하는 이미지를 GUI에 표시합니다. 그것이 없으면 이미지가 나타나지 않습니다. 그것은 뭔가를하고있을 것입니다. 그러나 위의 오류가 발생합니다. 우분투 12.04에서이 프로그램을 실행하고 있습니다. BTW, 저는 Python과 Tkinter를 처음 접했습니다. 이 오류를 제거하는 방법은 없습니까? 편집 : 이미지 추가는 loadPicture (file)를 호출하는 버튼 클릭으로 런타임 중에 발생합니다.글로벌 이름 'start'가 정의되지 않았습니다. Tkinter

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

오류 추적도 줄 번호를 표시해야합니다. 전체 오류 스택 추적을 붙여주십시오. –

+0

또한 tkinter에 익숙하지 않습니다. 'start' 함수가'Tkinter'에 정의되어 있습니까? –

+0

stacktrace를 추가하도록 편집되었습니다. –

답변

1

오류가 무엇이 잘못되었는지를 알려주고 있습니다. 코드에 전역 start 함수가 없습니다. 실제로 알 수 있듯이 근처에 어떤 방법 으로든 start 메서드가 없습니다. 왜 start이라는 함수를 호출해야한다고 생각합니까? 이 일을하도록 어딘가에 알려주는 문서가 있습니까?

내 생각에 IDLE에서 실행 중이며 존재하지 않는 start 함수를 호출하면 스크립트가 충돌합니다. 스크립트가 멈 추면 IDLE로 돌아가고 그 지점에서 생성 한 모든 창을 볼 수 있습니다.

코드에서 가장 명백한 문제는 루트 창을 만들지 않는다는 것입니다. 당신이 어떤 위젯 또는 StringVar의 인스턴스를 작성하기 전에 어딘가에 초기 스크립트에서, 당신은 같은 것을 할 필요가 :

root = Tk() 
+0

전체 코드를 게시하지 않았습니다. 코드를 편집하여 편집합니다. –

+0

@Detroitteatime : 문제는 동일하게 유지됩니다. 존재하지 않는 함수를 호출하고 있습니다. 왜 "start"라는 함수를 호출해야한다고 생각합니까? 그것은 무엇을해야 하는가? –

+0

그것을 이해하지 못한 채 어딘가에서 그것을 복사해야만한다. 맹목적으로 복사의 가격. 이미지를 보여주기 위해 사용되어야하는 것은 무엇입니까? –

-1

panel.start()

는 그냥 guess.Give 시도, 당신은 문제를 해결할 수있을보십시오.

+0

이것은 확실히 작동하지 않습니다. 'panel'은'start'라는 메서드가없는'Frame'의 인스턴스입니다. –

-1

root.mainloop()이 start() 대신에 작동합니다.

+0

작동하는 것처럼 보일지 모르지만, 그것은 mainloop을 사용하는 방법이 아닙니다. 이 코드는 이미 스크립트 맨 아래에서'mainloop'을 제대로 호출하고 있습니다. 그것을 다시 호출하는 것은 tkinter가 작동하도록 설계된 방법이 아닙니다. –

관련 문제