2014-12-16 6 views
0

idlelib 모듈을보고 파이썬 프로그래머가 IDLE을 어떻게 구현했는지, 어떤 점에서 EditorWindow.py 파일 안에 <<cut>> 또는 <<copy>>이라는 새로운 구문이있는 것을 발견했습니다. 특히, 그 구문은 bind 기능에 대한 이벤트 식별자 (나는 생각한다)로 사용되는 것 같다 그들 중 일부는 많은 사람들이 왜 거기에Tkinter에서 <<Name>의 의미는 무엇입니까?

text.bind("<<cut>>", self.cut) 

은 내가 이해하고 있지 않다 것은, 그들이 그것을 위해 특별히 만들 수 있었다 것 클래스 EditorWindow는 :

text.bind("<<cut>>", self.cut) 
text.bind("<<copy>>", self.copy) 
text.bind("<<paste>>", self.paste) 
text.bind("<<center-insert>>", self.center_insert_event) 
text.bind("<<help>>", self.help_dialog) 
text.bind("<<python-docs>>", self.python_docs) 
text.bind("<<about-idle>>", self.about_dialog) 
text.bind("<<open-config-dialog>>", self.config_dialog) 
text.bind("<<open-module>>", self.open_module) 
text.bind("<<do-nothing>>", lambda event: "break") 
text.bind("<<select-all>>", self.select_all) 
text.bind("<<remove-selection>>", self.remove_selection) 
text.bind("<<find>>", self.find_event) 
text.bind("<<find-again>>", self.find_again_event) 
text.bind("<<find-in-files>>", self.find_in_files_event) 
text.bind("<<find-selection>>", self.find_selection_event) 
text.bind("<<replace>>", self.replace_event) 
text.bind("<<goto-line>>", self.goto_line_event) 
text.bind("<<smart-backspace>>",self.smart_backspace_event) 
text.bind("<<newline-and-indent>>",self.newline_and_indent_event) 
text.bind("<<smart-indent>>",self.smart_indent_event) 
text.bind("<<indent-region>>",self.indent_region_event) 
text.bind("<<dedent-region>>",self.dedent_region_event) 
text.bind("<<comment-region>>",self.comment_region_event) 
text.bind("<<uncomment-region>>",self.uncomment_region_event) 
text.bind("<<tabify-region>>",self.tabify_region_event) 
text.bind("<<untabify-region>>",self.untabify_region_event) 
text.bind("<<toggle-tabs>>",self.toggle_tabs_event) 
text.bind("<<change-indentwidth>>",self.change_indentwidth_event) 
text.bind("<Left>", self.move_at_edge_if_selection(0)) 
text.bind("<Right>", self.move_at_edge_if_selection(1)) 
text.bind("<<del-word-left>>", self.del_word_left) 
text.bind("<<del-word-right>>", self.del_word_right) 
text.bind("<<beginning-of-line>>", self.home_callback) 

우리가이 구문 <<EVENT_NAME>>에 어떤 식 으로든 우리의 이벤트를 정의 할 수 있습니다 보인다.

저는 Python 3.4를 사용하고 있습니다.

+0

IDLE 관련 일 가능성이 높습니다. 다른 곳에서는 본 적이 없습니다. –

+0

@SimeonVisser 가상 이벤트가 지정되지 않았습니다. 풀 타임 답변 –

답변

1

가상 이벤트는 단일 대괄호 대신 이중으로 표시되며 tcl/tk의 일부이며 tkinter에는 물론 노출됩니다. 예를 들어, ttk.Notebook은 "<<NotebookTabChangede>>" 이벤트를 생성 할 수 있습니다.

widget.add_event(virtual, sequence, ...)으로 가상 이벤트를 작성하십시오. 여기서 virtual은 이중 대} 호 이름이고 각 sequence은 일] 대괄호 실제 이벤트 이름입니다. Widget.event_delete(virtual, sequence, ...)으로 그러한 연결을 삭제하십시오. w.event_info(virtual=None)으로 정보 얻기 물리적 이벤트와 마찬가지로 바이러스 이벤트를 bind으로 바인딩하십시오. (나는이 모든 것을 가지고있다 here

가상 이벤트는 실제 이벤트를 하드 코딩하지 않는다. 유휴 상태에서 옵션 -> 유휴 환경 설정 -> 일반 -> 사용자 정의 키 설정은 동작 및 키 바인딩 테이블이다. 가상 이벤트와 바인딩 된 이벤트 핸들러 둘 다 고정되어 있지만 이벤트를 호출하는 키 바인딩은 없습니다. 키 바인딩을 변경하면 event_delete 및 event_add가 적절하게 호출되고 키 바인딩이 생성되거나 변경되어 ~/.idlerc/config-keys.cfg에 저장됩니다.)

+0

그래서 내가 이해 한 것으로부터 가상 이벤트는 사용자가 쉽게 사용할 수 있도록 사용자 정의 이벤트입니다. 예를 들어, '

+0

@nbro Brian Oakey와 나는 둘 다 언급하면서 일부 tk 위젯은 가상 이벤트 자체를 추가합니다. 그 외에, 네, 당신의 예제는 제가 지적했던 'here'참고 문헌에있는 것입니다. –

1

<<..>>은 파이썬에 특정한 것이 아닙니다. Tk widget toolkit에만 해당됩니다. 이중 갈매기가있는 이벤트는 virtual events입니다.

편집기 창은 복잡한 위젯이며 IDLE은 코드 편집을 효과적으로 구현하기 위해 위젯에서 다양한 이벤트를 처리해야합니다.

+1

'<<...>>'이'Text' 위젯에 고유하지 않을 때, 다른 위젯은 가상 이벤트 (예 :'<< ListboxSelect >>')를 갖습니다. 질문에 언급 된 특정 이벤트는 텍스트 위젯과 관련 될 수 있습니다 (또는 더 구체적으로 말하면 IDLE이 텍스트 위젯을 사용하는 방법). 그러나 가상 이벤트는 일반적으로 '텍스트'위젯에 국한되지 않습니다. –

+0

@BryanOakley : 예, 표현이 정확하지 않은 경우 특정 위젯을 제거했습니다. –