2016-10-24 11 views
0

私はGUIプログラムを作成しています。私は2つのQCheckウィジェットを持っており、それらを両方とも単一の関数に接続したいと考えています。すべてのものは、このようなコードで結構です。Pythonでインラインループを使用してfunc nameをargとして送信する方法

widgets = [widget1,widget2] 
for widget in widgets: 
    self.connect(widget, SIGNAL("clicked()"), self.TheFunction) 

私はそれが非常に怠惰かもしれないが、それは、単一のラインの方法でこれを行うための方法である必要があります知っています!私はラムダを使うことができることを知っていますが、私はそれをこのように動作させる方法はありますか?

self.connect((x for x in (widget1,widget2)), SIGNAL("clicked()"),self.TheFunction) 

widget1widget2両方QObject秒であり、これはconnectを見ることを期待するものです。しかし、私が何を試しても、それは常に引数はQObjectではないことを教えてください!

+0

なぜそれを1行に入れるのですか?私は書いたままにしておくことをお勧めします。このために作成しようとしたジェネレータの問題は、ジェネレータを最初の引数として渡していることです。 – sytech

答えて

1

リストの内包表記を使用する必要がある場合は、1行

for x in (widget1, widget2): self.connect(x, SIGNAL("clicked()"), self.TheFunction) 

に簡単なforループを書くことができ、むしろ

あなた本当にはonelinerは私が提案させたい場合

list(self.connect(x, SIGNAL("clicked()"),self.TheFunction) for x in (widget1,widget2)) 

または

[self.connect(x, SIGNAL("clicked()"),self.TheFunction) for x in (widget1,widget2)] 

(感謝ジャン=フランソワ・ファーブル)

が、3つのラインで、あなたの最初のバージョンは、より読みやすいです。

+1

の場合、ジェネレータ関数を消費するか、何も実行されません! –

+0

ああこれは美しい。接続関数をリストから供給するのではなく、関数全体をリストに入れます。圧倒的に美しい。ありがとうFuras、ありがとうJean-Francois – Babakslt

1

あなたのコードは既に最適です。良い古いループがときどき特に役に立ちます。返り値connect(ジェネレータ関数やリストを作成しない)で何もしない場合は特にそうです。その後、

for widget in [widget1,widget2]: self.connect(widget, SIGNAL("clicked()"), self.TheFunction) 
0

コードの可読性が大幅new-style signal and syntaxを使用して、独自の行に各接続を置くことによって改善することができる。

widget1.clicked.connect(self.TheFunction) 
widget2.clicked.connect(self.TheFunction) 

私はあなたにも、このようにワンライナーを行うことができたとします

for widget in widget1, widget2: widget.clicked.connect(self.TheFunction) 

しかし、それは私には読みにくいです。

+0

私はPyQt4を使用していますが、残念ながらそれは動作しません。ありがとう、私はバージョン5でそれを使用します。 – Babakslt

+0

@Babakslt。非常に古いバージョン(i .. e。バージョン4.5より前)を使用していない限り、PyQt4では完璧に動作します。 – ekhumoro

関連する問題