ボタンをクリックしたときに関数に引数を渡したいのですが。この行に何を追加する必要がありますかbutton.connect(button, QtCore.SIGNAL('clicked()'), calluser(name))
それで値を関数に渡します:
def calluser(name):
print name
def Qbutton():
button = QtGui.QPushButton("button",widget)
name = "user"
button.setGeometry(100,100, 60, 35)
button.connect(button, QtCore.SIGNAL('clicked()'), calluser(name))
もう1つ、ボタンはfor
ループを使用して生成されます。したがって、name
の値は異なります。それぞれの名前をボタンでつけたいです。私はPytkでfor
ループを使用し、クリックされたときに引数の基本関数を呼び出すことで同じことを行いました。
通常、GUIはクラスを使用して作成されます。バインドされたメソッドをコールバックとして使用する(self.calluser
以下)self
の属性(例:self.name
):
たとえば、 このチュートリアル のわずかに変更されたコードを使用します。
import sys
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui
class QButton(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.button = QtGui.QPushButton('Button', self)
self.name='me'
self.button.clicked.connect(self.calluser)
def calluser(self):
print(self.name)
def demo_QButton():
app = QtGui.QApplication(sys.argv)
tb = QButton()
tb.show()
app.exec_()
if __name__=='__main__':
demo_QButton()
コールバック自体は常に追加の引数なしで呼び出されるため、多くのコールバックに個別の追加情報を渡す必要がある場合は、ボタンごとに異なるコールバックを作成する必要があります。
(手動で行うと)面倒な場合があるため、代わりに関数ファクトリを使用してください。例については、以下を参照してください。関数ファクトリーはクロージャーです。追加の引数を渡すことができます。内部関数は、呼び出されたときにアクセスできます。
class ButtonBlock(QtGui.QWidget):
def __init__(self, *args):
super(QtGui.QWidget, self).__init__()
grid = QtGui.QGridLayout()
names = ('One', 'Two', 'Three', 'Four', 'Five',
'Six', 'Seven', 'Eight', 'Nine', 'Ten')
for i, name in enumerate(names):
button = QtGui.QPushButton(name, self)
button.clicked.connect(self.make_calluser(name))
row, col = divmod(i, 5)
grid.addWidget(button, row, col)
self.setLayout(grid)
def make_calluser(self, name):
def calluser():
print(name)
return calluser
app = QtGui.QApplication(sys.argv)
tb = ButtonBlock()
tb.show()
app.exec_()
私はそれを行うための効率的な方法を試しました、そしてそれは私のためにうまくいきました。次のコードを使用できます。
from functools import partial
def calluser(name):
print name
def Qbutton():
button = QtGui.QPushButton("button",widget)
name = "user"
button.setGeometry(100,100, 60, 35)
button.clicked.connect(partial(calluser,name))
あなたは単に書くことができます
name = "user"
button.clicked.connect(lambda: calluser(name))
ここに別の方法があります。 ---一部-これは最もシンプルだと思います:
widget = QWidget()
widgetLayout = QVBoxLayout()
for action in list:
button = QPushButton("{action}".format(action=action['name']),self)
button.clicked.connect(partial(self.action_selected,action=action['name']))
widgetLayout.addWidget(button)
widget.setLayout(widgetLayout)
def action_selected(self,action):
print action
Pythonでは、クラスインスタンスを呼び出すことができます。クラスのインスタンスを関数として使用できます。そのクラスには、何でも含めることができます。 (一部の言語またはフレームワークでは、呼び出し可能なオブジェクトは ファンクターまたは関数オブジェクト と呼ばれます。)
class CallUser:
def __init__(self, name):
self.name = name
def __call__(self):
print(self.name)
def Qbutton():
button = QtGui.QPushButton("button",widget)
name = "user"
button.setGeometry(100,100, 60, 35)
button.clicked.connect(CallUser(name))
# Object of type CallUser will work as a function!
以下のコードは、生成されたボタンにデータを関連付ける方法を示しています。たとえば、ステートメント_self.keydata[b] = key
_を変更して、データのタプルを_self.keydata[b]
_に格納し、後でボタンイベントを処理するときに使用できます。
次のコードでは、assets
はボタンのタイトルを含む以前に定義された辞書です。 processButton(self)
ルーチンでは、self.sender()
はクラス変数_buttons[]
_のエントリと同じです。
_class Tab5(QtGui.QWidget):
buttons, keydata = {}, {}
def __init__(self, fileInfo, parent=None):
super(Tab5, self).__init__(parent)
layout = QtGui.QVBoxLayout()
for key in sorted(assets):
b = self.buttons[key] = QtGui.QPushButton(assets[key], self)
b.clicked.connect(self.processButton)
layout.addWidget(b)
print 'b[key]=',b, ' b-text=',assets[key]
self.keydata[b] = key
layout.addStretch(1)
self.setLayout(layout)
def processButton(self):
print 'sender=',self.sender(), ' s-text=',self.sender().text(), ' data[.]=', self.keydata[self.sender()]
pass
_
出力は次のようになり、最初の4行がfor
ループ中に出力され、最後の4行が4つのボタンが順番に押されたときに出力されました。
_b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca830> b-text= K1
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca908> b-text= K2
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca950> b-text= K3
b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca998> b-text= K4
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca830> s-text= K1 data[.]= L1
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca908> s-text= K2 data[.]= L2
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca950> s-text= K3 data[.]= L3
sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca998> s-text= K4 data[.]= L4
_