Seite 1 von 1
tkinter Button 2 commandos zuweisen
Verfasst: Sonntag 21. Juni 2015, 13:14
von pablow
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
Re: tkinter Button 2 commandos zuweisen
Verfasst: Sonntag 21. Juni 2015, 14:15
von 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
Re: tkinter Button 2 commandos zuweisen
Verfasst: Sonntag 21. Juni 2015, 17:53
von pablow
Danke für die schnelle antwort aber ich weiss nicht wirklich wie ich das auf mein Problem anwenden kann.
Re: tkinter Button 2 commandos zuweisen
Verfasst: Sonntag 21. Juni 2015, 20:09
von 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?
Re: tkinter Button 2 commandos zuweisen
Verfasst: Montag 22. Juni 2015, 08:38
von pablow
@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.
Re: tkinter Button 2 commandos zuweisen
Verfasst: Montag 22. Juni 2015, 13:01
von 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!
Re: tkinter Button 2 commandos zuweisen
Verfasst: Dienstag 23. Juni 2015, 15:56
von wuf
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
