Wpis z mikrobloga

Cześć!

Kolejny zestaw pytań o #tkinter w #python . Chcę powiązać wciśnięcie klawisza na klawiaturze z akcją danego przycisku (Button widget).

Dla części mi prawie działa tak jak chcę, a dla części nie. Już tłumaczę o co chodzi. Najpierw kod: https://pastebin.com/5vfSCNEd

Dla przycisku usuwania ostatniej cyfry wszystko działa. Mam funkcję z event=None, w _init odpowiedni .bind (master.bind('', self.clearlast)) i działa. Jednak w przypadku, gdy chcę połączyć enter numerycznej z działaniem równa się, to już w ogóle nie działa - dlaczego? Nazwę biorę stąd http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/key-names.html

Kolejne zdziwienie to akcja na Delete - z przyciskiem Delete klawiatury działa, ale również działa z kropką na numerycznej. Można jakoś to zmienić, żeby Delete nawiązywało jedynie do tego klawiaturowego a ./Del z numerycznej traktowało jako kropkę?

Nie znalazłem też nazwy dla enter klawiaturowego - szukałem tutaj http://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm

Kolejna sprawa to bindowanie klawiszy numerycznych. Czy muszę do nich tworzyć oddzielne funkcje, bo aktualnie mam to zrobione jako lambda: i nie mam pojęcia jak to wrzucić jako funkcję do bind.

I znów kwestia z klawiszami numerycznymi. robiąc funkcję master.bind('', self.equal) - dla testu - nie działa.
Nigdzie też nie mogę znaleźć dobrego wytłumaczenia, bo to co jest na necie to u mnie jakoś nie działa - pewnie coś pomijam, ale co?
#naukaprogramowania #programowanie
  • 7
@piotrb: Jakoś do tego doszedłem. Za enter użyłem , liczby wpisałem jako string. Do lambdy w bind dodałem event=None i działa, ale jeszcze jedno :)

Wszystko działa jak należy, po wciśnięciu przycisku dopisuje go do Entry, jednak nie ma animacji kliknięcia przycisku. Czym go wykonać? Jedyne co znalazłem na necie to funkcja, która zmienia wygląd przycisku i go powraca do standardowego, jednak zrobić to dla każdego przycisku to będzie masa kodu
jednak zrobić to dla każdego przycisku to będzie masa kodu


@Devih: Może czas pomyśleć o własnym widgecie, dziedziczącym z Buttona, jeżeli to jest dodanie jednej-dwóch rzeczy to raczej prosto się robi. Wpierw możesz jednak napisać tą funkcję do zmiany wyglądu (animacji nie ma chyba żaden znany mi system okienkowy) i podawać button jako parametr.
@piotrb: Pierwotnie po wciśnięciu jedynki dzieje się:

master.bind('1', lambda event=None: self.write_area.insert(END, "1"))
aktualnie wymyśliłem coś takiego:

master.bind('1', self.change)
def change(self, event=None):
self.button1.config(relief=SUNKEN)
self.button1.after(120, lambda: self.button1.config(relief=RAISED))

i pytanie: czy do master.bind oprócz self.change można dodać naraz funkcję lambda, którą jako pierwszą wkleiłem?
@Devih: Lambdę robisz tam po to, żeby ona się kiedyś wywołała, a wewnątrz change możesz spokojnie to (dopisanie jedynki) wywołać.
Poza tym, jak wczoraj szukałem błędu z kolumnami, to zrobiłem sobie :

def insert_value(self, value):
____self.write_area.insert(END, value)

i to później popodpinałem wszędzie (dzięki temu mieści się to w 78 kolumnach).
@piotrb: Kurde, że ja też na najprostsze rozwiązania wpaść nie mogę :D Taka funkcja super ułatwi mi to, co chcę osiągnąć. Dzięki wielkie, a PW już poszło :)