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
tkinter Button 2 commandos zuweisen
@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: 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?
@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.
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.
@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!
Wie man mehr als ein Ereignis an Rückruffunktionen bindet ist dagegen bei den Beispielen sogar zu sehen!
Hallo pablow
Hier eine Lösungs-Variante:
Gruss wuf 
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()

Take it easy Mates!