2009-09-20 9 views
9

Jestem nowy w Pythonie i staram się stworzyć prosty GUI za pomocą Tkintera.Zmiana fokusu z jednego widgetu Tekst na inny

Tak często w wielu interfejsach użytkownika, naciśnięcie przycisku karty zmieni fokus z jednego widżetu Tekst na inny. Ilekroć jestem w widgecie Tekst, zakładka tylko wcina kursor tekstowy.

Czy ktoś wie, czy jest to konfigurowalne? Jeśli nie, to czy ta funkcjonalność może być dostępna w ramach usługi PyQt lub dowolnej innej platformy interfejsu Python?

Odpowiedz

15

Jest to bardzo łatwe do zrobienia z Tkinter.

Jest kilka rzeczy, które muszą się przydarzyć, aby to zadziałało. Po pierwsze, należy się upewnić, że standardowe zachowanie nie ma miejsca. Oznacza to, że nie chcesz, aby karta wstawiała kartę i przenosiła fokus do następnego widżetu. Domyślnie zdarzenia są przetwarzane przez określony widget przed miejscem, w którym występuje standardowe zachowanie (zazwyczaj w powiązaniach klas). Tk ma prosty wbudowany mechanizm zatrzymujący zdarzenia od dalszego przetwarzania.

Po drugie, musisz się upewnić, że wysyłasz fokus do odpowiedniego widżetu. Istnieje wbudowana obsługa określenia, jaki jest następny widget.

Na przykład:

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

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

Ważne punkty o ten kod:

  • Sposób tk_focusNext() zwraca następny widget w hierarchii klawiatura przemierzania.
  • metoda ustawiania ostrości na ten widget
  • powracający "break" ma kluczowe znaczenie, ponieważ zapobiega wiązaniu klasy podczas strzelania. To powiązanie klasy wstawia znak tabulatora, którego nie chcesz.

Jeśli chcesz to zachowanie dla wszystkich widżetów tekstowych w aplikacji można wykorzystać metodę bind_class() zamiast bind() aby ten wiążący wpływ na wszystkie widgety tekstowe.

Możesz również ustawić ostrość dla konkretnego widgetu, ale zalecam trzymanie się domyślnej kolejności, a następnie upewnij się, że kolejność przejścia jest prawidłowa.

+1

Ten zwrot ("break") napiwek właśnie uratował mój dzień, dzięki Bryan! – Symon

+0

Miałem najczęściej niepowiązanych pytanie o tym, jak wykonać kilka dodatkowych kroków w odpowiedzi na , ** bez ** faktycznie zatrzymanie od wykonywania domyślnego zachowania. Ta odpowiedź doskonale to opisała. Dzięki! – JDM

-3

Ze względu na naturę platformy krzyżowej, przesunięcie ostrości można w pewnym stopniu dostosować, zazwyczaj pozwalając menedżerowi systemu Windows X na obsługę (z fokusem podąża za myszą lub kliknięciem). Zgodnie z the manual powinno być możliwe bind zdarzenie dla zdarzenia naciśnięcia klawisza, skanowanie dla naciśnięć tabulacji i wyzwalanie zdarzenia focusNext w tych przypadkach.

+0

Nie rozumiem to; Zasugerowałem dokładnie, co http: // stackoverflow.com/users/7432/bryan-oakley napisał w swojej zaakceptowanej odpowiedzi http://stackoverflow.com/questions/1450180/how-can-i-change-the- focus-from-one-text-box-to-another- w-python-tkinter/1451343 # 1451343 czyż nie? – dlamblin

+0

Twoja odpowiedź jest zbyt słaba, aby była przydatna. Nie sądzę, że to prawda, że ​​traversal focus można dostosować do własnych potrzeb "ze względu na naturę między platformami". Bycie na wielu platformach nie ma z tym nic wspólnego. Co więcej, twoja odpowiedź mówi: "powinno być możliwe". Jeśli szukam pomocy, a ktoś mówi: "to powinno być możliwe", nie wydaje mi się to zbytnio uspokajające. Albo to jest, albo nie jest. I na koniec "skanowanie w poszukiwaniu tabulatorów" nie ma sensu - nie ma sposobu, aby "[skanować] dla naciśnięć kart" i nie mówić, jak to zrobić. Wygląda na to, że twoją odpowiedzią jest domysły, które sprawiają, że jest mniej przydatna. –

0

Not sure about TKinter, ale z PyQt, można podłączyć funkcję do zmienionego tabem sygnału emitowanego przez tabulator (sygnał również przenosi wartość int). Ale o ile wiem, Qt jest całkiem niezły w robieniu właściwych rzeczy bez tego, by je sprecyzować.

0

Jest bardzo prosty w PyQt4 po prostu skorzystać z tej jednej linii poniżej i będzie można zmienić ostrość za pomocą przycisku TAB:

self.textEdit.setTabChangesFocus (true)