tkinter Button 2 commandos zuweisen

Fragen zu Tkinter.
Antworten
pablow
User
Beiträge: 3
Registriert: Sonntag 21. Juni 2015, 13:02

Hallo,

Ich habe für eine Motosteuerung ein Programm geschrieben. Der Motor bekommt eine Frame von Hex zahlen übertragen um vorzufahren. Um anzuhalten muss ich jedoch einen anderen datensatz senden. Deshalb möchte ich gerne den Button als Taster nutzen, was bedeutet ich muss beim drücken etwas senden können und beim loslassen. Im Moment sieht mein Button folgender maßen aus:

def lvor(): #Funktion Langsam Vor
message_bytes = "01110D020002E20CE803000040420F0004".decode("hex")
usart.write(message_bytes)
knopf2 = Button(text="Langsam vor", command=lvor, bg="grey", fg="Black")
knopf2.place(x=20, y=220, height=80, width=200)

Im moment fährt der Motor erst los wenn ich den Button wieder loslasse.

Danke für eure Hilfe
BlackJack

@pablow: So funktionieren Schaltflächen nun mal nicht. Wenn Du einen Taster möchtest, kannst Du nicht das Standardverhalten über `command` verwenden, sondern musst die entsprechenden Mausereignisse für Maustaste gedrückt und losgelassen an Rückruffunktionen binden. Siehe auch http://effbot.org/tkinterbook/tkinter-e ... ndings.htm
pablow
User
Beiträge: 3
Registriert: Sonntag 21. Juni 2015, 13:02

Danke für die schnelle antwort aber ich weiss nicht wirklich wie ich das auf mein Problem anwenden kann.
BlackJack

@pablow: Wo genau liegt denn das Problem? Hast Du Dir die verlinkte Seite überhaupt durchgelesen? Die Beispiele ausprobiert? Die dort beschriebenen Ereignisse nach für Dein Problem relevante Ereignisse durchgegangen? Welcher Code ist dann am Ende bei Dir dabei heraus gekommen und welches konkrete Problem gibt es damit?
pablow
User
Beiträge: 3
Registriert: Sonntag 21. Juni 2015, 13:02

@BlackJack:

Natürlich habe ich mir das ganze durchgelesen. Für mich würde ja auch ButtonPress und ButtonRelease Funktion in Frage kommen. Ich habe hier nicht erkennen können ob und wie man diese beiden Funktionen auf denselben Taster anwenden kann. Bei den Beispielen geht es auch immer um ein Fenster nicht um einen Button.
OK anstatt frame kann dann auch Button genommen werden, jedoch fehlt da immer noch die Beschreibung wie ich diese beiden Funktionen miteinander verbinden kann.
BlackJack

@pablow: Das mit den Ereignissen bezieht sich auf Widgets allgemein. Das es da jetzt nicht für jedes einzelne Widget ein Beispiel gibt, die ja letztendlich dann doch alle fast gleich sind und das damit wenig Erkenntnissgewinn bringen würde, sollte nicht verwundern. Probier's doch einfach mal aus einen `Button` anstelle eines `Frame` zu verwenden.

Wie man mehr als ein Ereignis an Rückruffunktionen bindet ist dagegen bei den Beispielen sogar zu sehen!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo pablow

Hier eine Lösungs-Variante:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

ACTION_PRESS = "gedrueckt"
ACTION_RELEASE = "losgelassen"
BUTTON_NAMES = ["Taster-{}".format(button_id) for button_id in range(8)]

class PushButton(tk.Button):
    def __init__(self, parent, callback=None, **options):
        self.callback = callback
        
        tk.Button.__init__(self, **options)
        self.bind("<ButtonPress>", self.press)
        self.bind("<ButtonRelease>", self.release)
        
    def press(self, event):
        self.action(ACTION_PRESS)

    def release(self, event):
        self.action(ACTION_RELEASE)

    def action(self, action):
        if self.callback:
            self.callback(self['text'], action)

def main():
    app_win = tk.Tk()
    for name in BUTTON_NAMES:
        PushButton(app_win, text=name, callback=push_button_callback).pack(
            expand=True)
    app_win.mainloop()
          
def push_button_callback(name, action):
    print(name, action)

main()
Gruss wuf :wink:
Take it easy Mates!
Antworten