Schreiben einer Test-App, um PIO-Zeilen zu emulieren, habe ich eine sehr einfache Python/Tk GUI-App. Verwenden Sie die numerischen Tasten 1 bis 8, um die PIO-Pins 1 bis 8 zu simulieren. Drücken Sie die Taste nach unten = PIO High, lassen Sie die Taste los = PIO wird niedrig. Wofür ich es brauche, ist nicht das Problem. Ich bin irgendwie in ein Kaninchenloch gegangen und habe versucht, eine Fabrik zu benutzen, um die Tastenrückruffunktionen zu erzeugen.Factory für Callback-Methoden - Python TKinter
hier etwas abgespeckte Code:
#!usr/bin/env python
"""
Python + Tk GUI interface to simulate a 8 Pio lines.
"""
from Tkinter import *
def cb_factory(numberic_key):
"""
Return a call back function for a specific keyboard numeric key (0-9)
"""
def cb(self, event, key=numberic_key):
bit_val = 1<<numberic_key-1
if int(event.type) == 2 and not (bit_val & self.bitfield):
self.bitfield |= bit_val
self.message("Key %d Down" % key)
elif int(event.type) == 3 and (bit_val & self.bitfield):
self.bitfield &= (~bit_val & 0xFF)
self.message("Key %d Up" % key)
else:
# Key repeat
return
print hex(self.bitfield)
self.display_bitfield()
return cb
class App(Frame):
"""
Main TK App class
"""
cb1 = cb_factory(1)
cb2 = cb_factory(2)
cb3 = cb_factory(3)
cb4 = cb_factory(4)
cb5 = cb_factory(5)
cb6 = cb_factory(6)
cb7 = cb_factory(7)
cb8 = cb_factory(8)
def __init__(self, parent):
"Init"
self.parent = parent
self.bitfield = 0x00
Frame.__init__(self, parent)
self.messages = StringVar()
self.messages.set("Initialised")
Label(parent, bd=1,
relief=SUNKEN,
anchor=W,
textvariable=self.messages,
text="Testing").pack(fill=X)
self.bf_label = StringVar()
self.bf_label.set("0 0 0 0 0 0 0 0")
Label(parent, bd=1,
relief=SUNKEN,
anchor=W,
textvariable=self.bf_label,
text="Testing").pack(fill=X)
# This Doesn't work! Get a traceback saying 'cb' expected 2 arguements
# but only got 1?
#
# for x in xrange(1,9):
# cb = self.cb_factory(x)
# self.parent.bind("<KeyPress-%d>" % x, cb)
# self.parent.bind("<KeyRelease-%d>" % x, cb)
self.parent.bind("<KeyPress-1>", self.cb1)
self.parent.bind("<KeyRelease-1>", self.cb1)
self.parent.bind("<KeyPress-2>", self.cb2)
self.parent.bind("<KeyRelease-2>", self.cb2)
self.parent.bind("<KeyPress-3>", self.cb3)
self.parent.bind("<KeyRelease-3>", self.cb3)
self.parent.bind("<KeyPress-4>", self.cb4)
self.parent.bind("<KeyRelease-4>", self.cb4)
self.parent.bind("<KeyPress-5>", self.cb5)
self.parent.bind("<KeyRelease-5>", self.cb5)
self.parent.bind("<KeyPress-6>", self.cb6)
self.parent.bind("<KeyRelease-6>", self.cb6)
self.parent.bind("<KeyPress-7>", self.cb7)
self.parent.bind("<KeyRelease-7>", self.cb7)
self.parent.bind("<KeyPress-8>", self.cb8)
self.parent.bind("<KeyRelease-8>", self.cb8)
def display_bitfield(self):
"""
Display the PIO lines (1 for on, 0 for off)
"""
bin_lst = []
for x in xrange(8):
bit = 1 << x
if bit & self.bitfield:
bin_lst.append("1")
else:
bin_lst.append("0")
bin_lst.reverse()
bin_str = " ".join(bin_lst)
self.bf_label.set(bin_str)
def message(self, msg_txt):
"set"
self.messages.set(msg_txt)
def cb_factory(self, numberic_key):
"""
Return a call back function for a specific keyboard numeric key (0-9)
"""
def cb(self, event, key=numberic_key):
bit_val = 1<<numberic_key-1
if int(event.type) == 2:
self.bitfield |= bit_val
self.message("Key %d Down" % key)
else:
self.bitfield &= (~bit_val & 0xFF)
self.message("Key %d Up" % key)
print hex(self.bitfield)
self.display_bitfield()
return cb
##########################################################################
if __name__ == "__main__":
root = Tk()
root.title("PIO Test")
theApp = App(root)
root.mainloop()
ich eine Art Methode Fabrik für den Rückruf arbeiten schließlich bekam aber ich es nicht sehr zufrieden.
Also meine Frage ist, können Sie eine Klassenmethode Factory, die Klassenmethoden die Art und Weise, die ich versucht habe, produzieren (siehe auskommentierter Code und App-Klasse-Methode cb_factory())?
HINWEISE: Ja, ich weiß, dass Sie mit dieser App nur 4 Tasten gleichzeitig gedrückt halten können, aber das ist gut genug für meine Zwecke.
Ja, das war es! Das "Selbst" war in der "cb" -Methode, die von "cb_factory" zurückgegeben wurde, überflüssig. Ich werde den geänderten Code veröffentlichen, um das Arbeitsbeispiel zu zeigen. Nun, wenn jemand mir das freundlicherweise erklären würde, ist mein Gehirn verletzt! –