Mehrere Push-Buttons in einer def

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
GoldenerReiter
User
Beiträge: 17
Registriert: Montag 14. Juli 2014, 16:13

Hallo,
ich habe bei Qt insgesamt 6 pusbuttons erstellt mit den Namen "Axis_1p", "Axis_1n","Axis_2p",...,"Axis_3n"
jetzt möchte ich wenn ich einen Button drücke, die Achse verfahren.
Dazu habe ihc bis jetzt

Code: Alles auswählen

def setmotorpositionsingle1p():
    global axis
    global direction
    axis = 1
    direction = 'p'
    motorpositionsingle()

workingWin.pushbtn_axis1p.connect("clicked()",setmotorpositionsingle1p)
und das ganze 6 mal. Wo ich dann nur den Wert für axis, sowie für direction ändere. Gibt es eine möglichkeit, im prinzip nur eine Funktion zu machen und den namen des Buttons mitzuliefern? Also ich habe es mir so ungefärh vorgestellt

Code: Alles auswählen

def setmotorpositionsingle():
    global axis
    global direction
    axis = name[-2]
    direction = name[1]
    motorpositionsingle()

workingWin.pushbtn_axis1p.connect("clicked()",setmotorpositionsingle,name="pushbtn_axis1p")
also das ich den Namen des Buttons mit übergebe und mir daraus dann die Achse und dir Richtung (p=positiv,n=negativ) ermitteln kann. Dann müsste ich nur noch 6 mal die Funktion

Code: Alles auswählen

workingWin.pushbtn_axis1p.connect("clicked()",setmotorpositionsingle,name="pushbtn_axis1p")
Aufrufen, wo ich dann dort den name übergeben kann.
Oder gibt es eine Möglichkeit, den Namen direkt von Qt zu ermitteln?

Hoffe, dass ihr da einen tip für mich habt.
Gruß
GoldenerReiter
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Schau dir mal im functools-Modul die partial-Funktion an, damit kannst du das machen. Ansonsten solltest du vergessen, dass es so etwas wie "global" überhaupt gibt. Wenn du dir nicht sicher bist ob du eine globale Variable brauchst, dann brauchst du sie nicht ;-)
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß nicht, was `motorpositionsingle` macht, aber falls es die Parameter axis und direction braucht, solltest Du sie auch als Parameter und nicht über globale Variablen übergeben, also

Code: Alles auswählen

def motorpositionsingle(axis, direction):
    ...
dann sieht ein connect so aus:

Code: Alles auswählen

import functools
...
workingWin.pushbtn_axis1p.connect("clicked()", functools.partial(motorpositionsingle, 1, 'p'))
besser noch solltest Du die Knöpfe und die Verbindungen nicht einzeln erstellen, sondern in einer Schleife.
GoldenerReiter
User
Beiträge: 17
Registriert: Montag 14. Juli 2014, 16:13

Ah,
'motorpositionsingle' benötigt die variablen axis und direction. Das war natürlich wirklich nicht schlau von mir, das über globale variablen zu machen. So etwas hätte ich auch eigentlich wissen müssen :( . Aber danke für den Hinweis, das habe ich sofort geändert.
Habe mir das mit dem functool mal angeguckt, da es zunächst ganz hilfreich aussah. Aber wenn ich das richtig verstanden habe, kann ich die funktion 'motorpositionsingle' nicht direkt aufrufen, sondern müsste sie durch eine zusätliche funktion aufrufen, wo ich noch eine variable mit übergebe. Da sehe ich nicht mehr ganz den sinn dahinter, ausser das der aufruf der benötigten funktion etwas verringert wird.
Ich würde aber gerne, direkt beim knopfdruck die Parameter an der Funktion übergeben und diese dann ausführen.
Gruß
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

GoldenerReiter hat geschrieben:Ich würde aber gerne, direkt beim knopfdruck die Parameter an der Funktion übergeben und diese dann ausführen.
genau das macht "partial" doch. Wo ist Dein Problem?
GoldenerReiter
User
Beiträge: 17
Registriert: Montag 14. Juli 2014, 16:13

Das Problem ist, dass wenn ich es so mache, dass das Programm immer abstürzt wenn ich den Button drücke.
Da muss ich dann nochmal gucken woran das liegt.
Antworten