2017-05-12 69 views
0

我正在使用tkinter,我試圖將一個字符串[在這種情況下,原始文件]與文本小部件中的文本進行比較。這裏的功能,並在那裏我調用該函數:調用RuntimeError中的結果後:超出最大遞歸深度

def checkText(): 
    if(text.get("1.0", "end-1c") != currentText): 
     print("Changed") 

    root.after(1000, checkText()) 

,並在那裏我呼籲:

root.after(1000, checkText()) #after 1 second, check text to see if it has changed 

它會返回錯誤:

File "main.py", line 65, in checkText 
    if(text.get("1.0", "end-1c") != currentText): 
    RuntimeError: maximum recursion depth exceeded 

除了數以百計的「文件「爲主。 py「,第65行,在checkText'

可能很明顯,我忽略了,但幫助表示讚賞。

只有這些地方的功能是在程序中使用或參考,但只是櫃面,這裏是currentText定義:

myfile = tkFileDialog.askopenfile(title='Open a file', mode='r') 
    text.delete('1.0', END) 
    loadedfile = myfile.read() 
    currentText = myfile.read() 

loadedFile將被直接放入文本組件和工作正常,所以我認爲currentText應該與widget中的loadedFile/text相同。

謝謝。

編輯:格式,還我意識到,我只能說currentText = loadedFile簡化它,但我保持原來的代碼問題

編輯:爲獲取文本

def fileOpen(textView): 
try: 
    myfile = tkFileDialog.askopenfile(title='Open a file', mode='r') 
    text.delete('1.0', END) 
    loadedfile = myfile.read() 
    currentText = loadedFile 
    currentFile = myfile.name 
    currentName = currentFile 
    currentName = currentName.rsplit('/', 1)[-1] #get the 'name.ext' part only 
    currentName = currentName.rsplit('\\', 1)[-1] #incase you're using windows 
    currentFileButton.config(text = currentName) 
    myfile.close() 
    textView.insert("end", loadedfile) 
except: 
    return 

def saveAs(): #define how to save files 
try: 
    global text 
    t = text.get("1.0", "end-1c") 
    saveLocation = tkFileDialog.asksaveasfilename() 
    file1 = open(saveLocation, "w+") 
    file1.write(t) 
    file1.close() 
except: 
    return 

後全功能:

text = Text(textFrame, bd=0, bg=color, fg=textColor) #make text editor box 
+0

看起來遞歸來自'text.get(「1.0」,「end-1c」)!= currentText'。要確認這一點,請嘗試添加一個「else」子句,以便在條件不滿足時打印某些內容。如果你這樣做,是否有東西打印? –

+0

@Rightleg我加了'else:print(「沒有改變」)',同樣的錯誤發生,沒有改變。 –

+0

當然這並不能解決問題,但是「已更改」或「未更改」是否曾打印過? –

回答

0

我終於明白了。如你所說,這很明顯,但實際上並不那麼明顯。

問題在於您致電after

當調用after,你需要通過時間和回調,這將在一定時間後要調用的函數。請注意,必須通過的是函數

但是當你撥打root.after(1000, checkText())時,第二個參數是而不是的一個函數。這是一個,它對應於checkText函數的返回值。


當你通過checkText()after會發生什麼:

  1. checkText被稱爲不帶參數
  2. 返回的值傳遞給after

可是,當你調用checkText,到達root.after(1000, checkText())的新呼叫已到達,並且checkText()必須進行評估,因此調用checkText

每次調用是即時的(即後1000毫秒不發生的話),因爲checkText()表達需要進行評估,以便傳遞給after


正如我所說的,對於after方法的第二個參數是一個函數。因此,正確的電話是root.after(1000, checkText)

的完整代碼:

def checkText(): 
    if(text.get("1.0", "end-1c") != currentText): 
     print("Changed") 

    root.after(1000, checkText) 

root.after(1000, checkText) 

這將有效地調度checkText功能被1000毫秒後調用。

+0

感謝您的幫助和友善。完美工作,你甚至給了一個美好的解釋 –

+0

@HunterKepley與Python玩得開心:) –

相關問題