2011-06-26 90 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

相关问题