Ich bin in Sachen Python und tkinter noch Beginner, höchstwahrscheinlich ist mein Problem ein sehr leicht lösbares.
Folgendes Szenario: Ich habe hier einen Schrittmoter, der über eine Schrittmotorsteuerung mit einem Raspberry Pi verbunden ist. Dazu habe ich mir mit tkinter und Beispielen aus dem Netz ein Frame mit zwei Buttons gebastelt, die den Schrittmotor jeweils links- bzw. rechtsherum drehen. Der Code funktioniert und tut, was er soll.
Ich initialisiere erst die Schrittmotorsteuerung mit einigen Parametern und erzeuge mir dann ein Fenster mit den Buttons, class App:.
Folgender Code:
Code: Alles auswählen
from PI_Stepper_Class import PI_Stepper
from tkinter import *
if __name__ == "__main__":
PI = PI_Stepper(port='/dev/ttyUSB0', baud=9600)
print('Stepper ID: '+ PI.ID())
#Initializing Stepper, see PI_Stepper_Class for further details
PI.set_Param50('1', '0')
print(PI.get_Param50('1'))
PI.set_Param14('1', '1')
print(PI.get_Param14('1'))
PI.set_AxisLimitMode('1', '3')
print(PI.get_AxisLimitMode('1'))
PI.set_Current('1', '200')
print(PI.get_Current('1'))
PI.set_Acceleration('1', '10000')
print(PI.get_Acceleration('1'))
PI.set_Servo('1', '1')
print(PI.get_Servo('1'))
PI.set_ReferenceMode('1', '0')
print(PI.get_ReferenceMode('1'))
PI.Error()
class App:
def __init__(self, master):
#Sets a frame with dimensions of 300x200 pixels
master.geometry("300x200")
fm = Frame(master)
Button(fm, text='-', repeatdelay=500, repeatinterval=75, command=self.btn_click_negative).pack(side=LEFT, fill=BOTH, expand=1)
Button(fm, text='+', repeatdelay=500, repeatinterval=75, command=self.btn_click_positive).pack(side=LEFT, fill=BOTH, expand=1)
Button(fm, text='Quit', fg='red', command=root.destroy).pack(side=LEFT, fill=BOTH, expand=1)
fm.pack(fill=BOTH, expand=YES)
def btn_click_negative(self):
PI.move_R( 1, 1 * (-640))
def btn_click_positive(self):
PI.move_R( 1, 1 * (640))
root = Tk()
app = App(root)
root.mainloop()
In meiner main.py initialisiere ich den Stepper und erzeuge mir etwas weiter unten das Fenster als Objekt der Display-Klasse.
Code: Alles auswählen
from cPIStepper import PI_Stepper
from cDisplay import Display
from tkinter import *
debug = True
if __name__ == "__main__":
PI = PI_Stepper(port='/dev/ttyUSB0', baud=9600)
PI.set_Param50('1', '0')
PI.set_Param14('1', '1')
PI.set_AxisLimitMode('1', '3')
PI.set_Current('1', '200')
PI.set_Acceleration('1', '10000')
PI.set_Servo('1', '1')
PI.set_ReferenceMode('1', '0')
if debug == True:
PI.get_Param50('1')
PI.get_Param14('1')
PI.get_AxisLimitMode('1')
PI.get_Current('1')
PI.get_Acceleration('1')
PI.get_Servo('1')
PI.get_ReferenceMode('1')
PI.get_Position('1')
PI.get_Error()
root = Tk()
Dis = Display(root, PI)
root = mainloop()
Code: Alles auswählen
from tkinter import *
class Display:
def __init__(self, master, Stepper):
#Sets a frame with dimensions of 300x200 pixels
master.geometry("300x200")
#Testing for Stepper-Instance
print('-------------')
Stepper.get_Acceleration('1')
print('-------------')
fm = Frame(master)
Button(fm, text='-', repeatdelay=500, repeatinterval=75, command=self.btn_click_negative(Stepper)).pack(side=LEFT, fill=BOTH, expand=1)
Button(fm, text='+', repeatdelay=500, repeatinterval=75, command=self.btn_click_positive(Stepper)).pack(side=LEFT, fill=BOTH, expand=1)
Button(fm, text='Quit', fg='red', command=master.destroy).pack(side=LEFT, fill=BOTH, expand=1)
fm.pack(fill=BOTH, expand=YES)
def btn_click_negative(self, Stepper):
Stepper.move_R( 1, 10 * (-640))
def btn_click_positive(self, Stepper):
Stepper.move_R( 1, 10 * (+640))
An der Stelle
Code: Alles auswählen
#Testing for Stepper-Instance
print('-------------')
Stepper.get_Acceleration('1')
print('-------------')
Weiter unten jedoch kommt er an die Stelle, an denen ich die Buttons definiert habe und hier passiert etwas seltsames:
Beim Starten des Programms löst er einmalig die Funktionen btn_click_negative(self, Stepper) bzw btn_click_positive(self, Stepper) aus, reagiert aber anschließend nie wieder auf die Buttonsklicks.
Wenn ich die Funktionen lediglich als btn_click_negative(self) deklariere (und entsprechend nicht das Objekt an die Funktion übergebe) bemängelt er in der Funktion, dass das Stepper-Objekt nicht existiert.
Es wäre toll, wenn jemand eine Idee hat, warum die Buttons korrekt funktionieren, wenn der Code in nur einer Datei liegt, aber nicht, wenn ich das Ganze auf zwei Dateien aufteile.