2011-06-26 88 views
3

我想在主文本窗口(不是Tkinter.entry - 這個例子可以找到)使用的自動填充算法提供的這個簡單的Tkinter的文本編輯器下面的代碼框。我認爲是在代碼示例[1]提供beeing依賴性的自動完成的話,即,在列表上的自動完成算法。在Python中實現文字自動完成/ Tkinter的基於文本編輯器

到目前爲止,我已經找到了兩個自動補全的代碼示例,一個是Tkinter使用輸入框[1],另一個是IDLE [2](由Jerry King編寫)的外部模塊。

到目前爲止,我所有的努力,產生通過移動[1]代碼的元素融入到文本編輯器都失敗了工作代碼。請注意,我是很新的Tkinter的,因此與整個框架掙扎以及

# taken from http://www.java2s.com/Code/Python/GUI-Tk/SimpleEditor.htm 


from Tkinter import * 
from tkSimpleDialog import askstring 
from tkFileDialog import asksaveasfilename 

from tkMessageBox import askokcancel   

class Quitter(Frame):       
    def __init__(self, parent=None):   
     Frame.__init__(self, parent) 
     self.pack() 
     widget = Button(self, text='Quit', command=self.quit) 
     widget.pack(expand=YES, fill=BOTH, side=LEFT) 
    def quit(self): 
     ans = askokcancel('Verify exit', "Really quit?") 
     if ans: Frame.quit(self) 


class ScrolledText(Frame): 
    def __init__(self, parent=None, text='', file=None): 
     Frame.__init__(self, parent) 
     self.pack(expand=YES, fill=BOTH)    
     self.makewidgets() 
     self.settext(text, file) 
    def makewidgets(self): 
     sbar = Scrollbar(self) 
     text = Text(self, relief=SUNKEN) 
     sbar.config(command=text.yview)     
     text.config(yscrollcommand=sbar.set)   
     sbar.pack(side=RIGHT, fill=Y)     
     text.pack(side=LEFT, expand=YES, fill=BOTH)  
     self.text = text 
    def settext(self, text='', file=None): 
     if file: 
      text = open(file, 'r').read() 
     self.text.delete('1.0', END)     
     self.text.insert('1.0', text)     
     self.text.mark_set(INSERT, '1.0')    
     self.text.focus()         
    def gettext(self):        
     return self.text.get('1.0', END+'-1c')   



class SimpleEditor(ScrolledText):       
    def __init__(self, parent=None, file=None): 
     frm = Frame(parent) 
     frm.pack(fill=X) 
     Button(frm, text='Open', command=self.onSave).pack(side=LEFT) 
     Button(frm, text='Save', command=self.onSave).pack(side=LEFT) 
     Button(frm, text='Cut', command=self.onCut).pack(side=LEFT) 
     Button(frm, text='Paste', command=self.onPaste).pack(side=LEFT) 
     Button(frm, text='Find', command=self.onFind).pack(side=LEFT) 
     Quitter(frm).pack(side=LEFT) 
     ScrolledText.__init__(self, parent, file=file) 
     self.text.config(font=('courier', 8, 'normal')) 
    def Open(self): 
     pass 
    def onSave(self): 
     filename = asksaveasfilename() 
     if filename: 
      alltext = self.gettext()      
      open(filename, 'w').write(alltext)   
    def onCut(self): 
     text = self.text.get(SEL_FIRST, SEL_LAST)   
     self.text.delete(SEL_FIRST, SEL_LAST)   
     self.clipboard_clear()    
     self.clipboard_append(text) 
    def onPaste(self):          
     try: 
      text = self.selection_get(selection='CLIPBOARD') 
      self.text.insert(INSERT, text) 
     except TclError: 
      pass          
    def onFind(self): 
     target = askstring('SimpleEditor', 'Search String?') 
     if target: 
      where = self.text.search(target, INSERT, END) 
      if where:          
       print where 
       pastit = where + ('+%dc' % len(target)) 
       #self.text.tag_remove(SEL, '1.0', END)  
       self.text.tag_add(SEL, where, pastit)  
       self.text.mark_set(INSERT, pastit)   
       self.text.see(INSERT)      
       self.text.focus() 



if __name__ == '__main__': 
    try: 
     SimpleEditor(file=sys.argv[1]).mainloop() 
    except IndexError: 
     SimpleEditor().mainloop()     

回答

0

嗯,有些想後,我想通了:

我使用的自動完成和AutocompleteWindow模塊從IDLE和爲手動添加所需的窗口參數。每次在鍵盤上擊中特定的一組字符時,都會調用自動完成功能。

+3

請,你能顯示代碼,以便其他人可以擁有的,你做了什麼,一個清晰的概念? – nbro

相關問題