Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Λόγω του ότι υπάρχουν αρκετά κουμπιά που θα έχουν παρόμοια λειτουργία onclick, ψάχνω να βρω έναν καλύτερο τρόπο από το να αναθέσω ξεχωριστά σε καθένα μια μέθοδο. Αυτή τη στιγμή τα έχω βάλει σε δύο ομάδες aray(7 κουμπιά έχει η καθεμία) και ήδη μπορώ να εκτελέσω κάποιες ενέργειες σε όλα  τα κουμπιά της ομάδας μέσω for loop, όπως θα θέσω το ίδιο κείμενο σε κάθε κουμπί για παράδειγμα.

Δεν ξέρω όμως πως μπορεί να γίνει και αν είναι εφικτό με παρόμοιο τρόπο, με κλικ πάνω σε ένα από τα κουμπιά της ομάδας να ανιχνεύεται ποιο πατήθηκε και να εκτελείται η αντίστοιχη ενέργεια  ή ενέργειες για αυτό το κουμπί.

Πιο συγκεκριμένα, τα κουμπιά της 1ης ομάδας έχουν ένα τυχαίο γράμμα ως κείμενο το κάθε ένα. Θέλω λοιπόν όταν πατηθεί κάποιο από αυτά, να μπαίνει το γράμμα αυτό ως κείμενο στο πρώτο διαθέσιμο(το πρώτο που δεν έχει κείμενο πχ) κουμπί της 2ης ομάδας.  Ο εύκολος τρόπος είναι να οριστεί μια μέθοδος για το κλικ το κάθε κουμπιού. Επειδή είναι όμως πολλά ψάχνω για κάποιο καλύτερο τρόπο. Για παράδειγμα, αντί για:

def btn1_clicked(self):
    ...
    ...

def btn2_clicked(self):
    ...
    ...

def btn3_clicked(self):
    ...
    ...

σκέφτομαι κάτι τέτοιο:

def btn[i] ():
    ....
    ....

όπου το i είναι το κουμπί(αντικείμενο) της λίστας με τα 7 κουμπιά που πατήθηκε. Έχω κάνει κάποιες προσπάθειες με βάση τα παραπάνω, χωρίς επιτυχία. 

Γνωρίζει λοιπόν κανείς, αν κατ' αρχήν είναι εφικτό κάτι τέτοιο, και πως μπορεί να γίνει?

Δημοσ. (επεξεργασμένο)

Χωρίς να δούμε κώδικα είναι λίγο δύσκολο να σε βοηθήσουμε... 

αυτό δεν γίνεται σίγουρα, είναι συντακτικό λάθος στην Python και δεν ξέρω αν υπάρχει major γλώσσα που να υποστηρίζει τέτοια σύνταξη

def btn[i] ():

Όπως και αν έχει, αν καταλαβαίνω καλά τι θες να κάνεις, αν έχεις buttons με παρόμοια λειτουργία, μπορείς να γράψεις ένα callback που να παίρνει arguments και να συνδέσεις όλα τα buttons με το ίδιο callback. Πχ

import sys

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
from PyQt5.QtCore import pyqtSlot


class App(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        btn1 = QPushButton('Button 1', self)
        btn2 = QPushButton('Button 2', self)
        btn3 = QPushButton('Button 3', self)

        btn1.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 1"))
        btn2.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 2"))
        btn3.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 3"))

        # You can also use functools.partial instead of lambdas
        # https://stackoverflow.com/questions/8824311/how-to-pass-arguments-to-callback-functions-in-pyqt/8824811
        #
        # import functools
        # btn1.clicked.connect(functools.partial(self.on_button_clicked, arg1="You clicked button 1"))
        # btn2.clicked.connect(functools.partial(self.on_button_clicked, arg1="You clicked button 2"))
        # btn3.clicked.connect(functools.partial(self.on_button_clicked, arg1="You clicked button 3"))


        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(btn1)
        hbox.addWidget(btn2)
        hbox.addWidget(btn3)
        self.setLayout(hbox)

        self.show()

    @pyqtSlot()
    def on_button_clicked(self, arg1):
        print(arg1)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

:

Επεξ/σία από pmav99
Δημοσ. (επεξεργασμένο)

Ναι, το  "dev btn " ξέρω ότι δεν είναι σωστό.  Το χρησιμοποίησα για να δείξω τι είναι αυτό που θέλω να κάνω.

Οι ομάδες των κουμπιών είναι αυτές:

#ομάδα κουμπιών γραμμάτων-λέξης
    def wordButtons(self):
        wrdBtn=QPushButton.buttons=(self.wordBtn1, self.wordBtn2, self.wordBtn3, self.wordBtn4, self.wordBtn5, self.wordBtn6, self.wordBtn7)
        return wrdBtn

    #ομάδα κουμπιών γραμμάτων
    def letterButtons(self):
        ltrBTn=QPushButton.buttons=[self.letterBtn1, self.letterBtn2, self.letterBtn3, self.letterBtn4, self.letterBtn5, self.letterBtn6, self.letterBtn7]
        return ltrBTn

Το τι θέλω να κάνω(το έγραψα και πιο πάνω) είναι:

Κάνοντας κλικ σε κάποιο από τα κουμπιά της ομάδας γραμμάτων, η ετικέτα του(που είναι ένα γράμμα), να ορίζεται ως ετικέτα στο πρώτο κενό(χωρίς κάποιο κείμενο ως ετικέτα δηλαδή) κουμπί της ομάδας Γραμμάτων-Λέξης. 

Αυτό που παρέθεσες δεν ξέρω αν βοηθάει. Θα προσπαθήσω να το ενσωματώσω στον κώδικα για να δω.

Edit:

Παίρνω το παρακάτω σφάλμα:

 self.wordBtn1.clicked.connect(lambda : self.on_button_clicked, arg1="You clicked button 1")
TypeError: 'arg1' is an invalid keyword argument for this function

Επεξ/σία από dancer_69
Δημοσ.

Έχεις δίκιο, ο σωστός κώδικας με τα lambda είναι αυτός που ακολουθεί. Έκανα λάθος copy paste. Παρόλα αυτά ο κώδικας με το partial δουλεύει αν και προφανώς δεν τον δοκίμασες.

        btn1.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 1"))
        btn2.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 2"))
        btn3.clicked.connect(lambda: self.on_button_clicked(arg1="You clicked button 3"))

Τώρα σχετικά με το αν έχει σχέση...

Αναφορά σε κείμενο

Λόγω του ότι υπάρχουν αρκετά κουμπιά που θα έχουν παρόμοια λειτουργία onclick, ψάχνω να βρω έναν καλύτερο τρόπο από το να αναθέσω ξεχωριστά σε καθένα μια μέθοδο. Αυτή τη στιγμή τα έχω βάλει σε δύο ομάδες aray(7 κουμπιά έχει η καθεμία) και ήδη μπορώ να εκτελέσω κάποιες ενέργειες σε όλα  τα κουμπιά της ομάδας μέσω for loop, όπως θα θέσω το ίδιο κείμενο σε κάθε κουμπί για παράδειγμα.

Δεν ξέρω όμως πως μπορεί να γίνει και αν είναι εφικτό με παρόμοιο τρόπο, με κλικ πάνω σε ένα από τα κουμπιά της ομάδας να ανιχνεύεται ποιο πατήθηκε και να εκτελείται η αντίστοιχη ενέργεια  ή ενέργειες για αυτό το κουμπί.

Πιο συγκεκριμένα, τα κουμπιά της 1ης ομάδας έχουν ένα τυχαίο γράμμα ως κείμενο το κάθε ένα. Θέλω λοιπόν όταν πατηθεί κάποιο από αυτά, να μπαίνει το γράμμα αυτό ως κείμενο στο πρώτο διαθέσιμο(το πρώτο που δεν έχει κείμενο πχ) κουμπί της 2ης ομάδας.  Ο εύκολος τρόπος είναι να οριστεί μια μέθοδος για το κλικ το κάθε κουμπιού. Επειδή είναι όμως πολλά ψάχνω για κάποιο καλύτερο τρόπο.

Βάσει των παραπάνω, η ερώτησή σου είναι αν μπορείς να αποφύγεις να γράψεις ξεχωριστό callback για το κάθε κουμπί και σε αυτό ακριβώς απαντάει το παράδειγμα που σου έδωσα. Έχεις 1 callback και N κουμπιά. Αν θες να ξεχωρίζεις ποιο κουμπί πατήθηκε κάθε φορά το κάνεις μέσω των arguments του callback. Το τι ακριβώς θες να κάνει το κάθε κουμπί είναι αδιάφορο

  • Like 1
Δημοσ. (επεξεργασμένο)

Όχι, δεν τον δοκίμασα, γιατί παράλληλα έψαχνα σχετικά με την πρώτη εκδοχή. Δεν τον δοκίμασα καθόλου όμως τελικά, μιας και με τη διόρθωση δούλεψε με το lambda και κατάφερα να κάνω αυτό που θέλω. Ευχαριστώ.

Επεξ/σία από dancer_69

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...