pygtk - B1()只接受1个参数(给定2个)

时间:2016-12-09 16:42:45

标签: python python-2.7 gtk pygtk

我正在使用PyGTK,当我尝试将GUI的信号(这只是使用Glade用XML编写的一个按钮)绑定到函数时,我收到以下错误:

TypeError: B1() takes exactly 1 argument (2 given)

这是我的Python代码:

#!/usr/bin/python2

import pygtk
pygtk.require('2.0')
from gi.repository import Gtk as gtk

class Main():
    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.add_from_file('/home/jatin/button.glade')
        self.MainWindow = self.builder.get_object('GW1')
        if self.MainWindow:
            self.MainWindow.connect("destroy", gtk.main_quit)

        dic = {
            'on_B1_clicked' : self.B1,
            'on_B2_clicked' : self.B2,
            'on_B3_clicked' : self.B3
        }
        self.builder.connect_signals(dic)
    def B1(self):
        return('ham')

    def B2(self):
        return('ham')

    def B3(self):
        return('ham')


M = Main()
gtk.main()

这是我的Glade文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="GW1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox" id="GB1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton" id="B1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <signal name="clicked" handler="on_B1_clicked" swapped="no"/>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="B2">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="B3">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
    <child>
      <placeholder/>
    </child>
  </object>
</interface>

有趣的是,如果我更改传入的参与者数量,错误消息会改变如下:

零参数:

TypeError: B1() takes no arguments (2 given)

使用2个参数我没有得到任何错误,但函数没有做到它应该做的事情。并且有3个或更多参数:

TypeError: B1() takes 3 arguments (2 given)

1 个答案:

答案 0 :(得分:0)

每个信号都有一些传递给连接信号处理程序的参数。查看文档以查看它们是什么。例如,您可以看到Gtk.Button's clicked signal接收按钮本身作为参数。

您的信号处理程序的参数数量必须与这些参数匹配,如果它是方法,则包括self。因此,B1的正确定义是:

def B1(self, button):

在某些情况下,您可能不关心传递给信号处理程序的值。在这种情况下,您可以执行以下操作:

def B1(self, *args):

文档中解释了here