2009-09-20 4 views
9

Ich bin neu in Python und ich versuche, eine einfache GUI mit Tkinter zu erstellen. Ändern Sie den Fokus von einem Text-Widget in ein anderesÄndern Sie den Fokus von einem Text Widget zu einem anderen

So oft in vielen Benutzeroberflächen, wird die Registerkarte Knopf schlagen. Wenn ich mich in einem Text-Widget befinde, wird nur der Textcursor eingezogen.

Weiß jemand, ob dies konfigurierbar ist? Wenn nicht, kann PyQt oder ein anderes Python-UI-Framework diese Funktionalität bieten?

Antwort

15

Dies ist sehr einfach mit Tkinter zu tun.

Es gibt ein paar Dinge, die diese Arbeit geschehen haben zu machen. Zuerst müssen Sie sicherstellen, dass das Standardverhalten nicht passiert. Das heißt, Sie möchten nicht, dass der Tab eine Registerkarte einfügt und den Fokus auf das nächste Widget verschiebt. Standardmäßig werden Ereignisse von einem bestimmten Widget verarbeitet, bevor das Standardverhalten auftritt (normalerweise in Klassenbindungen). Tk hat einen einfachen eingebauten Mechanismus, um Ereignisse von der weiteren Verarbeitung abzuhalten.

Zweitens müssen Sie sicherstellen, dass Sie den Fokus auf das entsprechende Widget senden. Es gibt eine integrierte Unterstützung, um zu bestimmen, was das nächste Widget ist.

Zum Beispiel:

def focus_next_window(event): 
    event.widget.tk_focusNext().focus() 
    return("break") 

text_widget=Text(...) 
text_widget.bind("<Tab>", focus_next_window) 

Wichtige Punkte über diesen Code:

  • Verfahren tk_focusNext() das nächste Widget in der Tastatur-Traversal-Hierarchie zurück.
  • das Verfahren focus() den Fokus auf dieses Widget ist in einem kritischen "break"
  • Rückkehr setzt, dass sie die Klasse Bindung von Feuern verhindert. Es ist diese Klassenbindung, die das Tabulatorzeichen einfügt, das Sie nicht möchten.

Wenn Sie dieses Verhalten für alle Text-Widgets wollen in einer Anwendung Sie die bind_class() Methode anstelle von bind() verwenden können diese Bindung beeinflussen alle Text-Widgets zu machen.

Sie können auch die Bindung Sende Fokus auf eine sehr spezifische Widget haben, aber ich empfehlen, mit der Standard Traversierfolgeliste kleben, dann stellen Sie sicher, die Traversierfolgeliste korrekt ist.

+1

Das return ("break") tipp hat mir gerade den Tag gerettet, danke Bryan! – Symon

+0

Ich hatte eine weitgehend unabhängige Frage darüber, wie einige zusätzliche Schritte in Reaktion auf eine , ** durchgeführt werden, ** ohne ** die von seinem Standardverhalten zu stoppen. Diese Antwort hat es perfekt abgedeckt. Vielen Dank! – JDM

-3

Aufgrund der plattformübergreifenden Natur, liegt der Fokus Traversal etwas anpassbar, in der Regel der X Windows-Manager damit umgehen zu lassen (mit Fokus Maus folgt, oder klicken Sie auf). Laut the manual sollte es möglich sein, ein Ereignis zu dem Tastendruckereignis bind, Scannen nach Tabulatordrücken und Auslösen eines focusNext Ereignisses in diesen Fällen.

+0

ich nicht bekommen es; Ich schlug genau vor, was http: // stackoverflow.com/users/7432/bryan-oakley schrieb in seiner akzeptierten Antwort http://stackoverflow.com/questions/1450180/how-can-i-change-the-focus-from-one-text-box-to-another- in-python-tkinter/1451343 # 1451343 habe ich nicht? – dlamblin

+0

Ihre Antwort ist zu schwach, um nützlich zu sein. Ich denke nicht, dass es wahr ist, dass Fokus-Traversal "aufgrund der plattformübergreifenden Natur" anpassbar ist. Cross-Plattform hat damit nichts zu tun. Außerdem sagt Ihre Antwort "es sollte möglich sein". Wenn ich Hilfe suche und jemand sagt "es sollte möglich sein", finde ich das nicht sehr beruhigend. Entweder ist es oder nicht. Und schließlich macht das "Scannen nach Tabulatordrücken" keinen Sinn - es gibt keine Möglichkeit, nach Tabulatoren zu "scannen" und man sagt nicht, wie man es macht. Es klingt wie Ihre Antwort ist eine Vermutung, die es weniger nützlich macht. –

0

Nicht sicher tkinter, aber mit PyQt, kann man eine Funktion auf das Register geändert Signal verbinden, indem die Lasche Feld ausgesendet (das Signal trägt auch einen int value). Aber soweit ich weiß, ist Qt ziemlich gut darin, das Richtige zu tun, ohne dass es spezifiziert wird.

0

Es ist wirklich einfach in PyQt4 einfach nutzen diese eine Zeile weiter unten, und Sie werden Fokus ändern, indem Sie Tab-Taste in der Lage:

self.textEdit.setTabChangesFocus (True)