dancer_69 Δημοσ. 30 Οκτωβρίου 2018 Δημοσ. 30 Οκτωβρίου 2018 Λόγω του ότι υπάρχουν αρκετά κουμπιά που θα έχουν παρόμοια λειτουργία onclick, ψάχνω να βρω έναν καλύτερο τρόπο από το να αναθέσω ξεχωριστά σε καθένα μια μέθοδο. Αυτή τη στιγμή τα έχω βάλει σε δύο ομάδες aray(7 κουμπιά έχει η καθεμία) και ήδη μπορώ να εκτελέσω κάποιες ενέργειες σε όλα τα κουμπιά της ομάδας μέσω for loop, όπως θα θέσω το ίδιο κείμενο σε κάθε κουμπί για παράδειγμα. Δεν ξέρω όμως πως μπορεί να γίνει και αν είναι εφικτό με παρόμοιο τρόπο, με κλικ πάνω σε ένα από τα κουμπιά της ομάδας να ανιχνεύεται ποιο πατήθηκε και να εκτελείται η αντίστοιχη ενέργεια ή ενέργειες για αυτό το κουμπί. Πιο συγκεκριμένα, τα κουμπιά της 1ης ομάδας έχουν ένα τυχαίο γράμμα ως κείμενο το κάθε ένα. Θέλω λοιπόν όταν πατηθεί κάποιο από αυτά, να μπαίνει το γράμμα αυτό ως κείμενο στο πρώτο διαθέσιμο(το πρώτο που δεν έχει κείμενο πχ) κουμπί της 2ης ομάδας. Ο εύκολος τρόπος είναι να οριστεί μια μέθοδος για το κλικ το κάθε κουμπιού. Επειδή είναι όμως πολλά ψάχνω για κάποιο καλύτερο τρόπο. Για παράδειγμα, αντί για: def btn1_clicked(self): ... ... def btn2_clicked(self): ... ... def btn3_clicked(self): ... ... σκέφτομαι κάτι τέτοιο: def btn[i] (): .... .... όπου το i είναι το κουμπί(αντικείμενο) της λίστας με τα 7 κουμπιά που πατήθηκε. Έχω κάνει κάποιες προσπάθειες με βάση τα παραπάνω, χωρίς επιτυχία. Γνωρίζει λοιπόν κανείς, αν κατ' αρχήν είναι εφικτό κάτι τέτοιο, και πως μπορεί να γίνει?
pmav99 Δημοσ. 31 Οκτωβρίου 2018 Δημοσ. 31 Οκτωβρίου 2018 (επεξεργασμένο) Χωρίς να δούμε κώδικα είναι λίγο δύσκολο να σε βοηθήσουμε... αυτό δεν γίνεται σίγουρα, είναι συντακτικό λάθος στην 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_()) : Επεξ/σία 31 Οκτωβρίου 2018 από pmav99
dancer_69 Δημοσ. 31 Οκτωβρίου 2018 Μέλος Δημοσ. 31 Οκτωβρίου 2018 (επεξεργασμένο) Ναι, το "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 Επεξ/σία 31 Οκτωβρίου 2018 από dancer_69
pmav99 Δημοσ. 31 Οκτωβρίου 2018 Δημοσ. 31 Οκτωβρίου 2018 Έχεις δίκιο, ο σωστός κώδικας με τα 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. Το τι ακριβώς θες να κάνει το κάθε κουμπί είναι αδιάφορο 1
dancer_69 Δημοσ. 31 Οκτωβρίου 2018 Μέλος Δημοσ. 31 Οκτωβρίου 2018 (επεξεργασμένο) Όχι, δεν τον δοκίμασα, γιατί παράλληλα έψαχνα σχετικά με την πρώτη εκδοχή. Δεν τον δοκίμασα καθόλου όμως τελικά, μιας και με τη διόρθωση δούλεψε με το lambda και κατάφερα να κάνω αυτό που θέλω. Ευχαριστώ. Επεξ/σία 31 Οκτωβρίου 2018 από dancer_69
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα